SpringMVC学习03:文件上传
SpringMVC学习03:文件上传
文件上传的前提
-
<form>
表单的enctype属性取值必须是multipart/form-data
,表示表单内容是分块的 -
<form>
表单的method属性取值必须是post,因为get有长度限制 -
提供一个
<input>
标签,type属性取值是file,用来上传文件 -
导入文件上传的相关jar包
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
传统方式文件上传
部署在Tomcat服务器上时,文件上传的目录在Tomcat\apache-tomcat-8.5.43\webapps\项目名目录下
/**
* 传统方式文件上传
* @param request
* @return
* @throws Exception
*/
@RequestMapping(path = "/fileUpload1")
public String fileUpload1(HttpServletRequest request) throws Exception {
System.out.println("传统方式文件上传");
//先获取要上传的文件目录
String realPath = request.getSession().getServletContext().getRealPath("/uploads");
//创建File对象,向该路径下上传文件
File file = new File(realPath);
//判断该路径是否存在,如果不存在,创建该路径
if(!file.exists()){
file.mkdirs();
}
//创建磁盘文件项工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//解析request对象
List<FileItem> fileItems = upload.parseRequest(request);
// 遍历
for (FileItem fileItem : fileItems) {
//判断文件项是普通表单项还是上传的文件
if(fileItem.isFormField()){
}else{
//获取上传文件的名称
String filename = fileItem.getName();
//把文件的名称设置唯一值,使用uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid + filename;
//上传文件
fileItem.write(new File(file,filename));
//删除临时文件
fileItem.delete();
}
}
return "success";
}
SpringMVC文件上传
-
SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的
name属性名称相同<h1>SpringMVC文件上传</h1> <form action="file/fileUpload2" method="post" enctype="multipart/form-data"> 文件上传:<input type="file" name="fileUpload"><br> <input type="submit" value="上传文件"> </form>
/** * SpringMVC文件上传 * @param request * @param fileUpload * @return * @throws Exception */ @RequestMapping(path = "/fileUpload2") public String fileUpload2(HttpServletRequest request, MultipartFile fileUpload) throws Exception { System.out.println("SpringMVC文件上传"); //先获取要上传的文件目录 String realPath = request.getSession().getServletContext().getRealPath("/uploads"); //创建File对象,向该路径下上传文件 File file = new File(realPath); //判断该路径是否存在,如果不存在,创建该路径 if(!file.exists()){ file.mkdirs(); } //获取上传文件的名称 String filename = fileUpload.getOriginalFilename(); //把文件的名称设置唯一值,使用uuid String uuid = UUID.randomUUID().toString().replace("-", ""); filename = uuid + filename; //上传文件 fileUpload.transferTo(new File(file,filename)); return "success"; }
-
配置文件解析器对象,在SpringMVC.xml中添加配置
<!--配置文件解析器,要求id必须是multipartResolver--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760"/><!--限制上传的文件大小--> </bean>
SpringMVC实现跨服务器文件上传
-
搭建图片服务器
-
导入跨服务器所需的jar包,在pom.xml中添加依赖的坐标
<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>1.18.1</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.18.1</version> </dependency>
-
创建文件上传的jsp页面
<h1>SpringMVC跨服务器文件上传</h1> <form action="file/fileUpload3" method="post" enctype="multipart/form-data"> 文件上传:<input type="file" name="fileUpload"><br> <input type="submit" value="上传文件"> </form>
-
创建控制器
/** * SpringMVC跨服务器方式的文件上传 * @param request * @return * @throws Exception */ @RequestMapping(value="/fileupload3") public String fileupload3(MultipartFile upload) throws Exception { System.out.println("SpringMVC跨服务器方式的文件上传..."); // 定义图片服务器的请求路径 String path = "http://localhost:9090/springmvc_fileUpload/uploads/"; // 获取到上传文件的名称 String filename = upload.getOriginalFilename(); String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase(); // 把文件的名称唯一化 filename = uuid+"_"+filename; // 向图片服务器上传文件 // 创建客户端对象 Client client = Client.create(); // 连接图片服务器 WebResource webResource = client.resource(path+filename); // 上传文件 webResource.put(upload.getBytes()); return "success"; }