查看原文(*^__^*) 嘻嘻……
java Web下接收文件常基于fileupload插件实现,其一般代码如下:
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Title</title>
</head>
<body>
<form action="/test/file" enctype="multipart/form-data"
method="post">
上传用户:<input type="text" name="username"/><br/>
上传文件:<input type="file" name="file2"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
对应的后台Controller代码:
@RequestMapping(value = "/test/file")
@ResponseBody
public String file (HttpServletRequest request,HttpServletResponse response) throws IOException{
response.setContentType("application/json;charset=utf-8");
try{
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*100);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setProgressListener(new ProgressListener(){
public void update(long pBytesRead, long pContentLength, int arg2) {
System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);
}
});
upload.setHeaderEncoding("UTF-8");
if(!ServletFileUpload.isMultipartContent(request)){
return;
}
upload.setFileSizeMax(1024*1024*10);
upload.setSizeMax(1024*1024*30);
List<FileItem> list = upload.parseRequest(request);
for(FileItem item : list){
if(item.isFormField()){
String name = item.getFieldName();
String value = item.getString("UTF-8");
System.out.println(name + "=" + value);
}else{
String filename = item.getName();
System.out.println(filename);
if(filename==null || filename.trim().equals("")){
continue;
}
filename = filename.substring(filename.lastIndexOf("\\")+1);
String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
filename = filename.substring(0,filename.lastIndexOf("."));
System.out.println("上传的文件的扩展名是:"+fileExtName);
FileManager fileManager = new FileManager();
if(FileManager.ERROR.equals(fileManager.save(filename,fileExtName,"song",item.getInputStream()))){
return JsonUtil.statusResponse(1,"上传文件失败",null);
}
}
}
}catch (FileUploadBase.FileSizeLimitExceededException e) {
e.printStackTrace();
return JsonUtil.statusResponse(1,"单个文件超出最大值!!!",null);
}catch (FileUploadBase.SizeLimitExceededException e) {
e.printStackTrace();
return JsonUtil.statusResponse(1,"上传文件的总的大小超出限制的最大值!!!",null);
}catch (Exception e) {
e.printStackTrace();
return JsonUtil.statusResponse(1,"其他异常,上传失败!!!",null);
}
return JsonUtil.statusResponse(0,"上传文件成功",fileManager.getFileURI(filename,fileExtName));
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
我是在SpringBoot下测试时,发现的该问题,即在解析请求时List list = upload.parseRequest(request);得到的list size=0,也就是根本没有得到文件数据。我在网上搜索该问题的解决方法,大致有以下两种:
(1)原因在于spring的配置文件中已经配置了MultipartResolver,导致文件上传请求已经被预处理过了,所以此处解析文件列表为空,对应的做法是删除该段配置。
(2)认为是structs的过滤器导致请求已被预处理,所以也要修改对应过滤器的配置。
然而,在SpringBoot下,上述两种解决方法不可能做到,因为SpringBoot的相关配置都是自己完成的,根本没有显示的配置文件。况且以上两种解决方法,修改配置文件可能影响整个工程的其他部分,所以得另寻方案。
我通过断点调试该Controller代码,发现传入的参数HttpServletRequest实例已经为StandardMultipartHttpServletRequest 对象了,且其结构中包含整个form表单的所有字段信息,我就想,区别于网上已有的两种解决方案,总是想避免这种预处理,何不就利用这种预处理,来简化自己的代码结构呢?于是就有了下面的解决代码。其方法很简单,就是对传入的request做强制转型,从而可以根据StandardMultipartHttpServletRequest 实例方法得到相关form表单数据,从而大大简化代码结构,示意如下:
@RequestMapping(value = "/file")
@ResponseBody
public String file (HttpServletRequest request, HttpServletResponse response) throws IOException {
...
try {
StandardMultipartHttpServletRequest req = (StandardMultipartHttpServletRequest) request;
Iterator<String> iterator = req.getFileNames();
while (iterator.hasNext()) {
MultipartFile file = req.getFile(iterator.next());
String fileNames = file.getOriginalFilename();
int split = fileNames.lastIndexOf(".");
//存储文件
//文件名 fileNames.substring(0,split)
//文件格式 fileNames.substring(split+1,fileNames.length())
//文件内容 file.getBytes()
...
}
}catch (Exception e){
e.printStackTrace();
return "fail";
}
return "success";
}