SpringBoot | 第十七章:web 应用开发之文件上传
source link: http://www.importnew.com/29795.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
前言
上一章节,我们讲解了利用 模版引擎
实现前端页面渲染,从而实现动态网页的功能,同时也提出了兼容 jsp
项目的解决方案。既然开始讲解web开发了,我们就接着继续往 web
这个方向继续吧。通常,我们在做 web
开发时,碰见诸如附件上传、图片头像上传等文件的上传需求也是再正常不过的。那么,我们今天我们就来讲讲 SpringBoot
下 文件上传
的功能的实现。
一点知识
我们知道,前端上传文件时,最常见的就是利用 Form
表单的方式进行文件的上传功能了,上传时设置 enctype
为 multipart/form-data
,或者直接利用 jquery
的一些上传插件实现。而后端,在 jsp+Servlet
时代,最常见的就是利用 smartupload
上传组件。而在 SpringMvc
时代,其提供了 MultipartFile
封装类,它包含了文件的二进制流和文件相关属性(文件名、大小等)。所以在 SpringBoot
中也是使用此封装类进行文件上传的。
文件上传
上面说到, springmvc
中是利用 MultipartFile
进行文件上传的。而 MultipartFile
是个接口类,它的实现类有 CommonsMultipartFile
和 StandardMultipartFile
。这里简单说明下:
StandardMultipartFile:是基于 j2ee
自带的文件上传进行解析,即使用 Servlet3.0
提供的 javax.servlet.http.Part
上传方式。
CommonsMultipartFile:是基于 apache fileupload
的解析。
所以正常我们使用时,也是无需关系底层是以哪种方式进行文件上传处理的, SpringMvc
会给我们做相应的转换的。
这里演示下两种方式。
基于J2EE自带方式
这种方式下,其实无需任何配置。只需按正常的web开发项目集成即可。
0.pom依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
1.配置文件(可选),正常只需要设置上传的文件大小
# 最大支持文件大小 即单个文件大小 spring.http.multipart.max-file-size=1Mb # 最大支持请求大小 即一次性上传的总文件大小 spring.http.multipart.max-request-size=10Mb
其他的配置,可直接参考官网的配置信息: https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/#common-application-properties
2.编写控制类
FileUploadController.java:
@RestController @Slf4j public class FileUploadController { @PostMapping("/upload") public String upload(@RequestParam MultipartFile file) throws IllegalStateException, IOException { // 判断是否为空文件 if (file.isEmpty()) { return "上传文件不能为空"; } // 文件类型 String contentType = file.getContentType(); // springmvc处理后的文件名 String fileName = file.getName(); log.info("服务器文件名:" + fileName); // 原文件名即上传的文件名 String origFileName = file.getOriginalFilename(); // 文件大小 Long fileSize = file.getSize(); // 保存文件 // 可以使用二进制流直接保存 // 这里直接使用transferTo file.transferTo(new File("d://okong-" + origFileName)); return String.format(file.getClass().getName() + "方式文件上传成功!\n文件名:%s,文件类型:%s,文件大小:%s", origFileName, contentType,fileSize); } }
3.启动应用,然后使用 postman
进行api调用即可,当然大家也可以利用上节课学习的模版引擎技术,编写一个文件上传的表单。
基于FileUpload包方式
原来在 Springmvc
时,我们通常都是使用 CommonsMultipartResolver
进行文件上传处理类配置的,比如最大上传文件大小的。而基于在 SpringBoot
下,略微有些不同。
0.pom加入 fileUpload
依赖
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency>
1.编写一个配置类
FileUploadConfig.java
@Configuration public class FileUploadConfig { @Bean public MultipartResolver custom() { return new CommonsMultipartResolver(); } }
2.由于 spring.http.multipart.enabled
默认是 true
,所以加载类 MultipartAutoConfiguration
会自动加载,这样fileUpload就会异常了。 所以正常有两种方式:在启动类下将此配置类不进行自动加载
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})
另一种就是,直接设置 spring.http.multipart.enabled
为 false
。
本示例为了两种可切换,使用的是第二种。
3.编写控制层:这个和 J2EE
的方式是一样的,这里就不贴了。
4.启动应用,使用postman访问下:
相关资料
总结
本章节主要是讲解了两种方式来进行文件的上传功能。这里就简单的介绍了两种方式的相关配置和一些注意点,像文件大小过大时进行异常捕获,大家可以使用全局异常类来进行捕获,只需捕获 MultipartException
异常即可,这里就示例了,相对来说比较简单了。
最后
目前互联网上很多大佬都有 SpringBoot
系列教程,如有雷同,请多多包涵了。本文是作者在电脑前一字一句敲的,每一步都是实践的。若文中有所错误之处,还望提出,谢谢。
Recommend
-
13
今天是大年初一,祝愿大家健健康康,短短几天,过年的喜悦被恐惧占据了,瞬间意识到什么才是大事,全家三口哪儿也没去,安安心心过除夕。 这周工作时间就三天,其他时间什么也没干,简单做个总结,过了今天,希望后面不要荒废下去...
-
12
SpringBoot系列(九)分分钟解决文件上传 往期推荐 SpringBoot系列(一)idea新建Springboot项目
-
23
简单记录一下在Springboot中上传文件到AWS S3存储服务的代码。 在 application . xml 中添加aws相关配置: custom: aw...
-
5
免费面向全球雇佣开发者为你的开源项目做贡献 - 我的透明创业实验第十七周 2019-09-09 by timqian Hello world, 我是
-
10
第十七周流水记 余果 2010-11-16 周记 突然意识到我现在已经没有导师了,3个月的时间已过,任何人再没有责任和义务帮我度过难关。 不过随着对流程的熟悉、工作节奏的掌握、业...
-
1
springboot大文件上传导致内存溢出,如何解决? - OSCHINA - 中文开源技术交流社区 开源问答...
-
5
SpringBoot 整合阿里云OSS文件上传、下载、查看、删除涉及知识点OSS简介,以及阿里云OSS控制台快速入门使用SpringBoot 整合 阿里云OSS存储服务,进行文件上传、下载、查看、删除阿里云OSS文档介绍,以及快速入门使用
-
1
通过Web应用向IPFS上传文件 IPFS ...
-
3
UniApp文件上传(SpringBoot+Minio) 一、Uni文件上传 (1)、文件上传的问题
-
1
因为最近做H5项目,需要拍照上传照片的功能。于是就写了一个传统的vue组件,功能实现都没问题,可是用着用着发现了问题:1.传统组件引用需要先import,然后放到c...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK