一. 文件上传
先说一下我们接下来要实现的功能:在jsp页面新建一个用于文件上传的表单,通过表单选择本地电脑上的任意文件,点击上传后保存在项目的根路径下(out/xxx/xxx/upload)
1. 添加相关依赖
在《SpringMVC:简单使用》一文中用到的依赖基础上,添加下面的两个依赖:
-
commons-fileupload-1.2.1.jar
-
commons-io-1.4.jar
2. 新建任意jsp(为方便起见,这里以index.jsp为例),添加用于上传的表单
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html> <html> <head> <title>Title</title> </head> <body> <form action="${pageContext.request.contextPath}/result" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上传"> </form> </body> </html>
其中 enctype=”multipart/form-data意为不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。[1]
method也必须是post才可以完成文件上传
input的type需要为file
3. 在spring-mvc.xml中配置CommonsMultipartResolver
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
4. 在Controller完成文件的保存
package io.zhangjia.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; @Controller public class Upload { @RequestMapping("/result") public String upload(MultipartFile file) throws IOException { System.out.println("file = [" + file + "]"); System.out.println(file.getName()); //参数名 System.out.println(file.getOriginalFilename());//文件名 System.out.println(file.getContentType());//文件类型 System.out.println(file.getSize());//文件大小 InputStream is = file.getInputStream(); return "result"; } } 输出: file = [org.springframework.web.multipart.commons.CommonsMultipartFile@480b15e5] file 1.png image/png 15030
二. 文件复制
一般文件复制或者保存的时候,为避免重名问题,不会再使用原文件名,可以通过UUID来生成一个唯一的标识。关于UIUD的简介,可以查看知乎:UUID是如何保证唯一性的?
package io.zhangjia.springmvc.controller; import org.apache.commons.io.IOUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import sun.nio.ch.IOUtil; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.UUID; @Controller public class Upload { @RequestMapping("/result") public String upload(MultipartFile file, HttpServletRequest request) throws IOException { String filename = file.getOriginalFilename();//获取文件名 InputStream is = file.getInputStream(); UUID uuid = UUID.randomUUID(); String realPath = request.getServletContext().getRealPath("/upload"); // realPath = E:\Java\IDEA_Project\JavaWeb\sping-mvc-1\out\artifacts\sping_mvc_1_war_exploded\upload File saveFile = new File(realPath+File.separator + uuid + filename.substring(filename.lastIndexOf("."))); File parentFile = saveFile.getParentFile(); if(!parentFile.exists()){ parentFile.mkdirs(); } FileOutputStream os = new FileOutputStream(saveFile); IOUtils.copy(is,os); os.close(); is.close(); return "result"; } }
三. 总结
1. 文件上传
-
form中添加enctype=”multipart/form-data”属性
-
spring-mvc.xml添加bean,class为CommonsMultipartResolver(快捷输入:CMR),id必须为multipartResolver
-
使用MultipartFile 作为形参来获取上传的文件
2. 文件复制
-
获取文件名
-
获取InputStream
-
获取UUID
-
获取保存的路径
-
判断并创建要保存的路径
-
获取FileOutputStream
-
复制文件
请登录之后再进行评论