前言:
1:什么是MultipartFile
MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称。
2:什么是transferTo
使用transferTo (本质上还是使用了流 只不过是封装了步骤)
会生成文件,最后不需要文件要删除
正文:
针对文件上传笔者在这里列举了三种情况,前后端主要是java和js
后端applicationContext.xml配置
(注:如果多文件较大,定义CommonsMultipartResolver,不要指定上传的文件大小)
一:基于表单的MultipartFile 单文件上传
前端:jsp
后端java代码
@RequestMapping(value="uploadFile",method={RequestMethod.POST})
public String UploadingVideo2(
@RequestParam(value = "videoUpload", required = false) MultipartFile file
) throws IOException{
String MD5File = UUID.randomUUID() + file.getOriginalFilename();// 对文件进行加密处理
String filePath = request.getSession().getServletContext().getRealPath("WEB-INF/photo");//文件存储路径
file.transferTo(new File(filePath+ File.separator + MD5File)); //进行写入文件
return "redirect:/SpringMVC/videoUploadSuc"; //表单提交结束重定向
}
二:基于ajax的MultipartFile 单文件上传
前端完整jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>
(function($){
$("#upload").on("click", function () {
var s = $('#file')[0].files[0];
var formData = new FormData();
formData.append("file_data", s);
formData.append("type", "1");
$.ajax({
url: "SpringMVC/fileUpload",
type: 'POST',
cache: false,
data: formData,
processData: false,
contentType: false,
success: function (result) {},
error: function (err) {}
});
})
}(jQuery));
//注:这里主要传输的是单个对象文件,多对象文件传输可能出现IllegalStateException异常
//1:多个文件内存之和小于3MB,不会出现此异常,因为它太小,Spring将其保存在内存中,
当我们请求文件时,它会从内存中检索。我们可以多次请求它,因为文件在内存中。
//2:多个文件内存之和大于3MB,报IllegalStateException异常
Spring将把它保存为一个临时文件,我们不知道它的位置,但是当我们读取输入流之后,
这个文件可能会被Spring内部删除。然后,当我们要求第二次,错误说“不能再读”。
后端java代码
@RequestMapping(value = "/fileUpload",method = RequestMethod.POST)
@ResponseBody
public JSONObject fileUpload(
@RequestParam("file_data") MultipartFile file_data, @RequestParam("type") String type){
String MD5File = UUID.randomUUID() + file.getOriginalFilename();// 对文件进行加密处理
String filePath = request.getSession().getServletContext().getRealPath("WEB-INF/photo");//文件存储路径
file.transferTo(new File(filePath+ File.separator + MD5File)); //进行写入文件
}
三:基于ajax的MultipartFile 多文件上传
前端完整jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
(function($){
$("#upload").on("click", function () {
var formData = new FormData();
if($('#file')[0].files[0]!=null){
formData.append('multipartFile1', $('#file')[0].files[0]);
}
if($('#file1')[0].files[0]!=null){
formData.append('multipartFile1', $('#file1')[0].files[0]);
}
if($('#file2')[0].files[0]!=null){
formData.append('multipartFile2', $('#file2')[0].files[0]);
}
if($('#file3')[0].files[0]!=null){
formData.append('multipartFile2', $('#file3')[0].files[0]);
}
if($('#file4')[0].files[0]!=null){
formData.append('multipartFile2', $('#file4')[0].files[0]);
}
formData.append("type", "222");
$.ajax({
url: "SpringMVC/fileUpload",
type: 'POST',
cache: false,
data: formData,
processData: false,
contentType: false,
success: function (result) {},
error: function (err) {}
});
})
}(jQuery));
//注:1:在js中 formData.append(key,value),相同的key是不会覆盖的,而是作为一个数组
这里根据传输的文件属于几个类别,定义几个数组,这里定义了multipartFile1、multipartFile2
// 2:在多文件上传时,后端只能以数组进行接收文件,
要是一个个文件的形式传输到后端,只要有一个空文件,后端则全部数据都无法接收到。
java代码
@RequestMapping(value = "fileUpload",method = RequestMethod.POST)
public void filesUpload(
@RequestParam("multipartFile1") MultipartFile[] multipartFile1,
@RequestParam("multipartFile2") MultipartFile[] multipartFile2) {
for (MultipartFile multipartFile : multipartFile1) {
saveFile(multipartFile);
}
for (MultipartFile multipartFile : multipartFile2) {
saveFile(multipartFile);
}
}
private boolean saveFile(MultipartFile file) {
// 判断文件是否为空
if (!file.isEmpty()) {
try {
String MD5File = UUID.randomUUID() + file.getOriginalFilename();// 对文件进行加密处理
String filePath = request.getSession().getServletContext().getRealPath("WEB-INF/photo");
file.transferTo(new File(filePath+ File.separator + MD5File));
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
注: 这里request需要在当前类中自动注解导入
@Autowired
private HttpServletRequest request;