SpringMCV(八):文件上传
2023-03-31 10:45:07 时间
一、导入相关依赖
<dependencies> <!--文件上传--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> </dependencies>
实际上我们需要的包有commons-fileupload和commons-io,但我们使用Maven时导入commons-fileupload包,Maven会自动帮我们导入它的依赖包commons-io。
二、前端建立一个文件上传的表单
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data"> <input type="file" accept="image/*" name="file"/> <input type="submit" value="上传文件"/> </form>
enctype时设置被提交数据的编码,enctype="multipart/form-data"是设置文件以二进制数据发送给服务器。
<input type="file" accept="image/*"> type="file"说明是要选择文件进行上传,accept="image/*"表示上传文件的MIME类型,这里表示的是各种类型的图片文件。
三、SpringMVC中配置MultipartResolver
SpringMVC能够支持文件上传的操作,但是需要在上下文中对MultipartResolver进行配置,具体配置如下:
<!--文件上传--> <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"> <!--请求的编码格式,默认为ISO-8859-1--> <property name="defaultEncoding" value="utf-8"/> <!-- 上传文件大小上限,单位为字节(byte),这里是10M和40K 第二个其实是一个阈值,小于此值文件会存在内存中,大于此值文件会存在磁盘上,所以理解成上传文件的最小上限没有问题 --> <property name="maxUploadSize" value="10485760"/> <property name="maxInMemorySize" value="40960"/> </bean>
四、编写文件上传的controller,这里有两种上传方法
方法一:
@RequestMapping("/upload") @ResponseBody public String fileUpload(@RequestParam("file") CommonsMultipartFile file , HttpServletRequest request) throws IOException { //上传的文件名 String uploadFileName = file.getOriginalFilename(); //判断文件名是否为空 if ("".equals(uploadFileName)){ return null; } //上传路径保存设置 String path = request.getServletContext().getRealPath("/upload"); //如果路径不存在,创建一个 File realPath = new File(path); if (!realPath.exists()){ realPath.mkdir(); } InputStream is = file.getInputStream(); //文件输入流 OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); //文件输出流 //读取写出 int len=0; byte[] buffer = new byte[1024]; while ((len=is.read(buffer))!=-1){ os.write(buffer,0,len); os.flush(); } os.close(); is.close(); return "/upload/" + uploadFileName; }
方法二:
@RequestMapping("/upload2") @ResponseBody public String fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException { //上传路径保存设置 String path = request.getServletContext().getRealPath("/upload"); File realPath = new File(path); if (!realPath.exists()){ realPath.mkdir(); } //上传的文件名 String uploadFileName = file.getOriginalFilename(); //通过CommonsMultipartFile的方法直接写文件( file.transferTo(new File(realPath +"/"+ uploadFileName)); return "/upload/" + uploadFileName; }
注意: 这里如果上传路径保存设置是多级目录,就需要用File.mkdirs()。
(本文仅作个人学习记录用,如有纰漏敬请指正)
相关文章
- 深入探讨Java中的异常与错误处理
- 研究学习Kotlin的一些方法
- 数据显示Java热度持续下落,日子屈指可数?
- 2017年5月编程语言排行榜:Java与C语言优势正开始缩小
- Java多线程之内置锁与显示锁
- Java线程池的理论与实践
- 白话阿里巴巴Java开发手册(编程规约)
- 关于Java你不知道的十件事
- Java服务化系统线上应急和技术攻关,你必须掌握的Linux命令
- Java实现高斯模糊和图像的空间卷积
- Java阻塞队列实现原理分析
- NPM使用技巧
- Node.js对Java开发者而言是什么?
- Java反射机制应用实践
- 理解RxJava中的Single和Completable
- 2017年你不能错过的Java类库
- 大规模集群下的Hadoop NameNode
- 从源码解密Spark内存管理
- 2017年3月编程语言排行榜:Swift首次进入前十
- JVM热点技术:Java类的加载机制