博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[原创]SpringBoot上传图片踩的坑
阅读量:6319 次
发布时间:2019-06-22

本文共 3556 字,大约阅读时间需要 11 分钟。

最近项目里面有个需求,要上传图片到阿里云的OSS服务。所以需要写个上传图片的接口给前端。

这个简单的接口本来就给分配了1个工时,感觉也蛮简单的。但编码过程中遇到了好几个问题,现在一一记录下来,避免再次踩坑。

  • 1、图片不能超过1M
    报错信息:
org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.

分析原因:

图片大小超过了最大限制大小1048576 bytes=1MB,在org.springframework.boot.autoconfigure.web.MultipartProperties中可以看到默认的maxFileSize为1MB。
解决方案:
在application.properties中配置

spring.http.multipart.maxFileSize = 10MB
  • 2、图片不能超过10M,连接重置
    报错信息:
org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (10559924) exceeds the configured maximum (10485760)

前端报错:

Status:(failed)net::ERR_CONNECTION_RESET

分析原因:

请求大小超过了最大限制大小10485760 bytes=10MB,在org.springframework.boot.autoconfigure.web.MultipartProperties中可以看到默认的maxRequestSize为10MB。

解决方案:

@RestControllerAdvice@ResponseStatus(HttpStatus.BAD_REQUEST)public class MultipartExceptionConfigHandler {    private final Logger logger = LoggerFactory.getLogger(getClass());    @ExceptionHandler(MultipartException.class)    public MsCommonResult handleMultipartException(MultipartException icEx, HttpServletRequest request) {        logger.warn("请求业务报错 uri: {}, message: {} ", request.getRequestURI(), icEx.getMessage());        return MsCommonResult.fail("禁止上传大文件到服务器");    }}

配置ExceptionHandler后,但是并没有返回给前端400的状态码。继续研究后注意到org.apache.coyote.http11.AbstractHttp11Protocol的maxSwallowSize为2097152=2MB。

继续解决:

@Beanpublic TomcatEmbeddedServletContainerFactory tomcatEmbedded() {    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();    tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {        if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol
)) { // -1 means unlimited ((AbstractHttp11Protocol
) connector.getProtocolHandler()).setMaxSwallowSize(-1); } }); return tomcat;}

至此,前台收到返回,返回信息如下:

HTTP/1.1 400X-Application-Context: ms.maker.company:8071Content-Type: application/json;charset=UTF-8Transfer-Encoding: chunkedDate: Wed, 05 Dec 2018 09:37:58 GMTConnection: close{"result":500,"detail":"禁止上传大文件到服务器","data":null}
  • 3、Linux服务器返回413:Request Entity too large
    报错信息:
413 Request Entity Too Large

413 Request Entity Too Large


nginx/1.12.2

分析原因:

图片大小超过1M时,提示该信息。经研究nginx的client_max_body_size默认大小为1m。

解决方案:

在http/server/location段配置client_max_body_size: 10m即可。
  • 4、返回JSON,IE9及低版本接受返回后,提示文件下载
    原因:
    后台响应的Content-Type为“application/json”,IE浏览器不识别。
    将返回的数据由对象转为json字符串,浏览器竟然可以自动识别解析。
    解决方案:
方案一:@PostMapping(value = "/aliyunOssUpload", produces = "text/html;charset=UTF-8")public String aliyunOssUpload(@RequestParam("file") MultipartFile uploadFile)方案二:@PostMapping(value = "/aliyunOssUpload")public String aliyunOssUpload(@RequestParam("file") MultipartFile uploadFile, HttpServletResponse response) {    response.setContentType("text/html;charset=UTF-8");}方案三:@PostMapping(value = "/aliyunOssUpload")public String aliyunOssUpload(@RequestParam("file") MultipartFile uploadFile, HttpServletResponse response) {    response.setHeader("Content-Type", "text/html;charset=UTF-8");}

转载于:https://www.cnblogs.com/Candies/p/10072411.html

你可能感兴趣的文章
实现android activity之间的跳转
查看>>
XMPP协议实现原理介绍
查看>>
HttpWebRequest类
查看>>
Eureka 的 Application Client client的执行演示样例
查看>>
从决策树学习谈到贝叶斯分类算法、EM、HMM
查看>>
Ubuntu 14.04 字体设置
查看>>
【转载】VS配置路径和宏
查看>>
Appium移动自动化测试(四)--one demo
查看>>
jQuery来源学习笔记:扩展的实用功能
查看>>
STM32 CRC-32 Calculator Unit
查看>>
BZOJ2790 : [Poi2012]Distance
查看>>
jenkins 安装 SVN Publisher 后向 svn 提交代码报错: E170001: Authentication required for...
查看>>
伪异步IO理解
查看>>
成为JAVA GC专家系列
查看>>
我的编程之路(十八) 团队开发
查看>>
Redis的消息通知
查看>>
Cocos2d-x中触摸事件
查看>>
Word2010插入页码分节符
查看>>
mysql benchmark基准测试
查看>>
JS获取中文拼音首字母,并通过拼音首字母高速查找页面内的中文内容
查看>>