在Spring 4MVC中实现文件的上传下载很简单,如同使用struts2实现文件上传下载一样。
首先实现单文件的上传:
- 新建的jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form action="oneFileUpload.spring" method="post" enctype="multipart/form-data">
<input type="text" name="username"/>
<input type="file" name="uploadFile"/>
<input type="submit" value="开始上传" />
</form>
</body>
</html>
与其他的jsp文件没有什么不同,需要注意的是form表达需要设置一下enctype属性值为“multipart/form-data”;
- 在SpringMVC-servlet.xml中添加通用的解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="2048000000"></property>
</bean>
这里bean的id一定要命名为“multipartResolver”,否则框架注入这个bean的时候会出错。这个bean的作用就是判断请求中是否有上传文件的请求。
- 然后实现控制层
@Controller
public class FileUpload {
@RequestMapping("/oneFileUpload")
public void oneFileUpload(MultipartHttpServletRequest request,HttpServletResponse response){
try{
System.out.println("username = "+request.getParameter("username"));
//获取将要上传的文件
MultipartFile file = request.getFile("uploadFile");
//获取上传文件的原名
String uploadFileName = file.getOriginalFilename();
//获取要上传文件的输入流
InputStream isRef = file.getInputStream();
String targetDir = request.getSession().getServletContext().getRealPath("/upload");
//在上传的目录中创建文件
File targetFile = new File(targetDir,uploadFileName);
//获取文件的输出流
FileOutputStream fosRef = new FileOutputStream(targetFile);
//文件的复制
IOUtils.copy(isRef, fosRef);
}catch(Exception e) {
e.printStackTrace();
}
}
}
这里使用的是没有注解的获取上传文件的方法,还有一种是基于注解的方法,更为常用。
@Controller
public class FileUpload2 {
@RequestMapping("/upload")
public void oneFileUpload(@RequestParam String username,
@RequestParam MultipartFile uploadFile,HttpServletRequest request){
System.out.println("username="+username);
MultipartFile file = uploadFile;
String uploadFileName = file.getOriginalFilename();
try {
InputStream isRef = file.getInputStream();
String targetDir = request.getSession().getServletContext().getRealPath("/upload");
File targetFile = new File(targetDir,uploadFileName);
FileOutputStream outRef = new FileOutputStream(targetFile);
IOUtils.copy(isRef, outRef);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这样就实现了单文件的上传.备注:在相应的目录下要建立上传的文件夹upload,否则会报错。
多文件的上传其实和单文件上传一样,jsp文件和配置文件就省略了,直接看控制层的代码
@Controller
public class MuchFileUpload {
@RequestMapping("/muchFileUpload")
public void muchFile(MultipartHttpServletRequest request){
System.out.println("username="+request.getParameter("username"));
try{
//获取将要上传的多个文件<文件名,文件>
Map<String,MultipartFile> fileMap = request.getFileMap();
System.out.println("上传的文件的数量为:"+fileMap.size());
//将键转为set
Set<String> fileSet = fileMap.keySet();
//获取set集合的迭代器
Iterator<String> fileNameIterator = fileSet.iterator();
while(fileNameIterator.hasNext()) {
String fileName = fileNameIterator.next();
System.out.println(fileName);
MultipartFile file = fileMap.get(fileName);
fileName = file.getOriginalFilename();
InputStream isRef = file.getInputStream();
String targetDir = request.getSession().getServletContext().getRealPath("/upload");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy_mm_dd_hh_mm_ss");
String getDateString = sdf.format(new Date());
File targetFile = new File(targetDir,getDateString+"_"+fileName);
FileOutputStream outRef = new FileOutputStream(targetFile);
IOUtils.copy(isRef, outRef);
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
上面就实现了文件的上传
Spring 4MVC框架下的文件下载实现【同理配置文件以及jsp省略】
控制层的代码为:
@Controller
public class FileDownload {
@RequestMapping("/download")
public void download(HttpServletRequest request,HttpServletResponse response) throws Exception {
String name = "中文.rar";
String fileName = new String(name.getBytes(),"IOS8859-1");
response.setContentType("application/x-msdownload");
FileInputStream fisRef = new FileInputStream(new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+name));
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
OutputStream osRef = response.getOutputStream();
IOUtils.copy(fisRef, osRef);
}
}
上面便实现了文件的相关操作,在这个操作中,用到了俩个JAR包,commons-fileupload.jar以及commons-io.jar。