springboot 阿里云oss图片上传和异常处理

news2024/11/15 14:22:48

自己去申请开通阿里云oss。

对象存储 OSS_云存储服务_企业数据管理_存储-阿里云

1.在pom.xml添加依赖

        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.14.0</version>
        </dependency>

 2.在application.yml 加入OSS配置值

aliyun:
  oss:
    # oss对外服务的访问域名
    endpoint: oss-cn-xxxxx.aliyuncs.com
    # 访问身份验证中用到用户标识(填自己的)
    accessKeyId: xxxxxx
    # 用户用于加密签名字符串和oss用来验证签名字符串的密钥(填自己的)
    accessKeySecret: xxxxxx
    # oss的存储空间
    bucketName: xxxxx
    # 上传文件大小(M)
    maxSize: 3
    # 上传文件夹路径前缀
    dir:
      prefix: xxxxxx/

3.在项目的包config创建配置类OssConfig.java

package com.xxxx.config;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 阿里云OSS配置信息
 */
@Configuration
public class OssConfig {

    @Value("${aliyun.oss.endpoint}")
    String endpoint;

    @Value("${aliyun.oss.accessKeyId}")
    String accessKeyId;

    @Value("${aliyun.oss.accessKeySecret}")
    String accessKeySecret;

    @Bean
    public OSSClient createOssClient() {
        return (OSSClient) new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }
}

4. 在控制层 上传图片,新建UploadController.java

package com.xxxx.controller;

/**
 * 阿里云Oss上传图片
 */
@RestController
public class UploadController {

    @Value("${aliyun.oss.bucketName}")
    private String bucketName;

    @Value("${aliyun.oss.dir.prefix}")
    private String dirPrefix;

    @Resource
    private OSSClient ossClient;

    
    //允许上传的格式 可以自己增加上传文件格式
    private static final String[] IMAGE_TYPE = new String[]{".jpg", ".jpeg", ".gif", ".png"};

    @PostMapping("/upload")
    public ApiRestResponse upload(@RequestParam("photo") MultipartFile file) {
        //在这里写判断file isEmpty是无效的,压根进不去,之间就被拦截异常了
        //if(file.isEmpty()){....}
        //写file.getSize()也是无效的

        boolean bol = assessFileType(file);
        if (!bol) {
            return ApiRestResponse.error(400, "上传格式不对~");
        }
        String url = "";
        try {

            InputStream inputStream = file.getInputStream();
            //整理文件名称
            String fileName = getFileName(file);
            //创建PutObject请求
            PutObjectResult result = ossClient.putObject(bucketName, fileName, inputStream);
            System.out.println(result);

            //关闭OOSClient
            //ossClient.shutdown();

            //返回完整路径给前端
            url = "https://" + bucketName + "." + ossClient.getEndpoint().getHost() + "/" + fileName;
        } catch (IOException e) {
            return ApiRestResponse.error(400, "上传失败~");
        }
        return ApiRestResponse.success(url);
    }

    /**
     * 整理上传 文件名称 和 路径
     * @param file
     * @return
     */
    private String getFileName(MultipartFile file) {
        // 文件后缀
        String suffixName = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf("."));
        //文件名称
        String fileName = UUID.randomUUID().toString() + suffixName;

        //当前年月日
        String loalYmd = DateTimeUtil.localYmd();
        String path = dirPrefix + loalYmd + "/" + fileName;

        return path;
    }

    /**
     * 判断文件格式
     */
    private boolean assessFileType(MultipartFile file) {
        //对图片的后缀名做校验
        boolean isPass = false;
        for (String type : IMAGE_TYPE) {
            if (StringUtils.endsWithIgnoreCase(file.getOriginalFilename(), type)) {
                isPass = true;
                break;
            }
        }
        return isPass;
    }
}

5. 需要注意的是,如果上传图片为空,或者 上传图片过大。后端控制台会直接报错。比如:

上传图片是空的

控制台报:因为我异常做了统一封装

异常情况org.springframework.web.multipart.MultipartException: Current request is not a multipart request

 网上的帖子说,给postman的header加content-type为multipart/form-data。

但我测试时,加不加是无所谓的。加了反而又报其他bug。

如果你在控制层,做判断,也不行的

if(file.isEmpty()){
   //图片没上传
}

因为springboot直接就把异常给捕捉了,并返回统一异常

{
    "code": 404,
    "msg": "服务器异常~",
    "data": null
}

6. 还有一个异常是,上传文件过大时报

控制台打印出。 

Maximum upload size exceeded; nested exception is 
java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: 
The field photo exceeds its maximum permitted size of 2097152 bytes.

网上的说法都是tomcat已经默认允许你只上传1M的文件,但我这里是2M的。

但我oss配置的最大文件不是3M吗?

 然后在application.yml写配置,在server怎么写,控制台永远都是1M的

 应该在spring写配置

7.最后怎么让前端能正确返回异常消息呢?

    /**
     * 处理文件上传大小超限制
     */
    @ExceptionHandler(MultipartException.class)
    @ResponseBody
    public ApiRestResponse fileUploadExceptionHandler(MultipartException e) {
        log.error("上传文件异常:", e);
        if (e.getRootCause() instanceof org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException) {
           
            return ApiRestResponse.error(400, "上传文件不能超过2M");

        }else if(e.getRootCause() instanceof org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException){
            
            return ApiRestResponse.error(400, "上传文件异常");
        }
        return ApiRestResponse.error(400, "上传文件不存在或异常");
    }

8.异常返回

9.正确返回

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/508910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

港科夜闻|香港科大与香港资管通有限公司签署校企合作备忘录,成立校企合作基金促科研成果落地...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与香港资管通有限公司签署校企合作备忘录&#xff0c;成立校企合作基金促科研成果落地。“港科资管通领航基金”28日在香港成立&#xff0c;将致力于推动高校科研成果转化&#xff0c;助力香港国际创科中心建设。…

Fabric.js 拖拽顶点修改多边形形状

theme: smartblue 我正在参加「掘金启航计划」 本文简介 戴尬猴&#xff0c;我是德育处主任 这次要介绍的一个demo是"拖拽多边形定点修改多边形形状"。 其实 Fabric.js 官网也有这个demo&#xff1a;Fabric.js demos Custom controls, polygon 。但这个demo可能对于…

ASEMI代理ADV7611BSWZ原装ADI车规级ADV7611BSWZ

编辑&#xff1a;ll ASEMI代理ADV7611BSWZ原装ADI车规级ADV7611BSWZ 型号&#xff1a;ADV7611BSWZ 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;LQFP-64 批号&#xff1a;2023 引脚数量&#xff1a;64 工作温度&#xff1a;-40C~85C 安装类型&#xff1a;表面贴装型 …

怎么轻松地搞定Win11系统备份任务?

“我是一个电脑小白&#xff0c;不是很懂电脑的一些操作。我刚买了一台新电脑&#xff0c;它装的是Win11系统&#xff0c;我害怕它出现什么问题&#xff0c;听朋友说可以通过备份的方法保护系统&#xff0c;这是真的吗&#xff1f;有谁知道该怎么进行Win11系统备份吗&#xff1…

OJ练习第101题——柱状图中最大的矩形

柱状图中最大的矩形 力扣链接&#xff1a;84. 柱状图中最大的矩形 题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 思路 我们先嵌…

第2章 Nginx环境搭建

第2章 Nginx环境搭建 2.1 下载 免费开源版的官方网站&#xff1a;http://nginx.org Nginx 有 Windows 版本和 Linux 版本&#xff0c;但更推荐在 Linux 下使用 Nginx&#xff1b; 下载nginx-1.14.2.tar.gz的源代码文件&#xff1a;wget http://nginx.org/download/nginx-1.…

登录功能实现及文件上传下载功能补充

登录功能实现简单介绍&#xff1a; 1&#xff1a;登录时密码输入错误刷新登陆页面并提示登录信息错误&#xff1b; 2&#xff1a;输入正确用户名及密码点击sign in 登录成功。&#xff08;如果勾选remember me 只要服务器未停止&#xff0c;可以直接免登录进入欢迎页面&#x…

《光电容积法在评估高血压中的应用》阅读笔记

目录 一、论文摘要 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课…

ubuntu系统配置软件脚本自启动

背景 项目因为某些原因需要服务器自启动来执行脚本, 因此需要在ubuntu服务器上面实现自启动功能. 步骤 ubuntu作为服务器使用时&#xff0c;常常需要在机器重启时能自动启动我们开发的服务。 Ubuntu 18.04不再使用initd管理系统&#xff0c;改用systemd&#xff0c;包括用sys…

Redis:哨兵集群

目录 基于pub/sub 机制的哨兵集群组成基于pub/sub 机制的客户端事件通知由哪个哨兵执行主从切换哨兵实例是不是越多越好&#xff0c;如果同时调大 down-after-milliseconds 值&#xff0c;对减少误判是不是也有好处 部署多个哨兵实例就形成了一个哨兵集群。哨兵集群中的多个实例…

【Redis】Redis面试题

Redis的事务 什么是Redis的事务 Redis的事务是一个单独的隔离操作&#xff0c;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断&#xff0c;所以Redis事务是在一个队列中&#xff0c;一次性、顺序性、排他…

人工智能基础:从机器学习到深度学习的发展和应用

随着信息技术的快速发展&#xff0c;人工智能技术已经成为当今最热门的技术之一。在人工智能技术中&#xff0c;机器学习和深度学习是最为关键的两个技术分支。本文将从机器学习的基础概念、机器学习的发展史、深度学习的基本概念、深度学习的应用以及深度学习的未来趋势等方面…

Chunjun数据同步工具初体验

chunjun (纯钧) 官方文档纯钧 chunjun 有四种运行方式&#xff1a;local、standalone、yarn session、yarn pre-job 。 运行方式/环境依赖flink环境hadoop环境localstandalone√yarn session√√yarn pre-job√√ 1.下载 官网已经提供了编译好的插件压缩包&#xff0c;可以…

【译】Java 内存泄露的构造和检测

1. 概述 在 Java 应用程序中&#xff0c;内存泄漏会导致严重的性能下降和系统故障。开发人员必须了解内存泄漏的发生原因以及如何识别和解决它们。 在本教程中&#xff0c;我们将提供一个使用失效的监听器问题作为示例来创建 Java 内存泄漏的指南。我们还将讨论各种检测内存泄…

GitHub Copilot 使用介绍

什么是 Github Copilot https://github.com/features/copilot Github Copilot 是一种人工智能辅助开发工具&#xff0c;由 GitHub 和 OpenAI 合作开发&#xff0c;旨在通过机器学习算法为开发人员提供自动化的代码提示和智能建议&#xff0c;从而提高开发效率&#xff0c;该系…

【Vue】 CLI WebStorage

CLI 本地存储 自定义事件 WebStorage(js本地存储)localStoragesessionStorage WebStorage(js本地存储) 存储内容大小一般支持5MB左右(不同浏览器可能还不一样) 浏览器端通过Window.sessionStorage 和Winodw.localStorage 属性来实现本地存储机制相关API xxxStorage.setItem(‘…

TCP协议介绍

文章目录 一、TCP协议二、TCP协议段格式4位首部长度可靠性理解32位序号和32位确认序号16位窗口大小TCP协议中的6个标记位16位紧急指针 三、TCP三次握手和四次挥手TCP的三次握手TCP的四次挥手状态变化 四、超时重传机制五、滑动窗口高速重发机制(快重传) 六、流量控制七、拥塞控…

Java分布式事务(十八)

文章目录 🔥最终一致性分布式事务解决方案_什么是最大努力通知型分布式事务🔥最大努力通知型分布式事务_最大努力通知与可靠消息最终一致性的区别🔥最大努力通知型分布式事务解决方案🔥最大努力通知型分布式事务_案例业务说明🔥最大努力通知型分布式事务实战_实现充值…

Adobe XD 下载和安装教程

文章目录 Adobe XD 简介Adobe XD 下载Creative Cloud 下载与安装Adobe XD 下载 Adobe XD 安装Adobe XD 启动 Adobe XD 简介 Adobe XD是一个协作式易用平台&#xff0c;可帮助团队为网站、移动应用程序、语音界面、游戏等创建设计。 Adobe XD是一站式UX/UI设计平台&#xff0c;…

能否实现有价值观的--AI ?

人机融合所形成的新系统确实有可能产生新的科技革命。人机融合可以将人类的智慧和创造力与机器的计算能力和数据处理能力相结合&#xff0c;从而创造出更加智能化和高效化的新系统和产品。例如&#xff0c;人机融合可以推动智能制造、智能医疗、智能交通、智慧城市等各个领域的…