准备工作
Web项目中,文件上传功能几乎是必不可少的,那么如何使用SpringMVC框架完成文件的上传以及下载,其底层使用的是Apache fileupload
组件完成上传,SpringMVC只是进行了封装,让开发者使用起来更加方便,所以首先需要引入fileupload组件的依赖。
1.引入相关依赖包
commons-fileupload
commons-fileupload
1.3.1
2.配置文件上传视图解析器
该视图解析器由SpringMVC提供,注意bean的id为固定值
单文件上传
1.准备上传表单
注意表单的method
必须为post
,get请求只会提交文件名到后台
表单的enctype
值固定为multipart/form-data
,以二进制的形式传输数据
2. 编写上传服务
这里使用由SpringMVC提供的MultipartFile
接口,使用工具类完成上传操作
@RequestMapping(value="/doUpload", method=RequestMethod.POST)
public String doUploadFile(@RequestParam("file") MultipartFile file,HttpServletRequest request) throws IOException{
if(!file.isEmpty()){
//originalFilename:文件原始名称
log.debug("Process file: {}", file.getOriginalFilename());
//FileUtils.copyInputStreamToFile(file.getInputStream(),
// new File("d:\\remoteDemo\\", System.currentTimeMillis()+ file.getOriginalFilename()));
//上传到webapp下的resources/imgs目录中
String path = request.getServletContext().getRealPath("/resources/imgs");
//文件上传,将文件流拷贝到目标文件对象中
FileUtils.copyInputStreamToFile(file.getInputStream(),
new File(path, System.currentTimeMillis()+ file.getOriginalFilename()));
//上传的第二种方式,使用file提供的方法
//file.transferTo(new File(path, System.currentTimeMillis()+ file.getOriginalFilename()));
//返回成功页面
return "success";
}
return "error";
}
多文件上传
1.准备上传表单
2.多文件上传服务
第一种方式:使用SpringMVC提供的文件请求包装类MultipartHttpServletRequest
@RequestMapping(value="/doUpload2", method=RequestMethod.POST)
public String doUploadFile2(MultipartHttpServletRequest multiRequest) throws IOException{
//遍历
Iterator filesNames = multiRequest.getFileNames();
while(filesNames.hasNext()){
String fileName =filesNames.next();
MultipartFile file = multiRequest.getFile(fileName);
if(!file.isEmpty()){
log.debug("Process file: {}", file.getOriginalFilename());
FileUtils.copyInputStreamToFile(file.getInputStream(),
new File("d:\\remoteDemo\\", System.currentTimeMillis()+ file.getOriginalFilename()));
}
}
return "success";
}
第二种方式:依然使用SpringMVC提供的文件请求包装类MultipartHttpServletRequest
@RequestMapping(value = "/doUpload2", method=RequestMethod.POST)
@ResponseBody
public String doUploadFile2(MultipartHttpServletRequest multiRequest, HttpServletRequest request) throws Exception{
//另一种遍历方式,这时候要求前端文件表单的name值都为file
List files = multiRequest.getFiles("file");
String path = request.getSession().getServletContext().getRealPath("file");
if(files != null && !files.isEmpty()){
for (int i = 0; i < files.size(); i++) {
MultipartFile file = files.get(i);
if(!file.isEmpty()){
FileUtils.copyInputStreamToFile(file.getInputStream(), new File(path, file.getOriginalFilename()));
}
}
return "success";
}
return "error";
}
第三种方式:使用MultipartFile
数组接收参数
@RequestMapping(value = "/doUpload2", method=RequestMethod.POST)
@ResponseBody
public String doUploadFile2(@RequestParam("file") MultipartFile[] files, HttpServletRequest request) throws Exception{
//同样要求前端文件表单的name值都为file
String path = request.getSession().getServletContext().getRealPath("file");
for (MultipartFile file : files) {
if (file.getSize() > 0) {
String fileName = file.getOriginalFilename();
File f = new File(path, fileName);
file.transferTo(f);
}
}
return "success";
}
文件下载
1.文件下载表单
下载图片
2.文件下载服务
@RequestMapping(value = "/download")
public void downloadFile(String fileName, HttpServletRequest request, HttpServletResponse response){
if(fileName != null){
String realPath = request.getSession().getServletContext().getRealPath("file/");
File file = new File(realPath, fileName);
OutputStream out = null;
if(file.exists()){
//设置下载完毕不打开文件
response.setContentType("application/force-download");
//设置文件名
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
try {
out = response.getOutputStream();
//使用工具类
out.write(FileUtils.readFileToByteArray(file));
out.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(out != null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}