Spring web模块支持文件的上传与下载,下面两个章节分别介绍对应的内容
文件的上传
依赖的JAR
主要用到commons-fileupload-1.3.jar以及commons-io-2.4.jar.
如果使用Maven,可添加如下配置
commons-fileupload commons-fileupload 1.3 commons-io commons-io 2.4
修改页面
首先要使对应的form支持文件的提交,增加enctype属性
再添加如下代码块到form中
修改控制器
添加@RequestParam(value = "pic", required = false) MultipartFile 到控制器的对应方法的参数中,并且对上传文件进行处理
/** * 该方法没有指定处理的路径,表示可以处理的路径是 * /spitter,且method是POST,@Valid表示在传入Spitter对象作为方法的参数之前, * 会进行值的校验,并将结果存在BindingResult中 * * @param spitter * , 在newspitter.jsp中编辑的对象 * @param result * , 通过redirect 的方式返回路径 * @param uploadFile * , 支持文件上传.RequestRaram 中的"pic"的值应该和页面中上传组件的名字相同 * @return * @throws IOException */ @RequestMapping(method = RequestMethod.POST) public String addSpitter( @ModelAttribute("NewSpitter") @Valid Spitter spitter, BindingResult result, @RequestParam(value = "pic", required = false) MultipartFile uploadFile) throws IOException { if (result.hasFieldErrors()) { return "spitter/edit"; } //文件上传的处理 if (uploadFile != null) { if (uploadFile.getContentType().equalsIgnoreCase("image/jpeg")) { File file = new File("./resouces/pic/" + System.currentTimeMillis() + ".jpeg"); FileUtils.writeByteArrayToFile(file, uploadFile.getBytes()); } } spitterService.addSpitter(spitter); return "redirect:/spitter/" + spitter.getUserName(); }
修改配置文件
文件的下载
文件的下载相对比较简单,只需要修改对应的控制器便可.为了演示,在D:\Program Files\Apache Software Foundation\Apache Tomcat 7.0.21\bin\resouces\pic\ 目录下放了一个1390110889206.jpeg文件,下面的改动将演示如何下载该文件
控制器的代码
/**下载指定的文件
*访问路径:http://localhost:8080/SpringInActionWebSample/spitter/downloadfile
* @param request
* @param response
* @return
* @throws Exception
*/
@RequestMapping("downloadfile")
public ModelAndView downloadTest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String storeName = "1390110889206.jpeg";
String realName = "test.jpeg";
String contentType = "application/octet-stream";
download(request, response, storeName, contentType, realName);
return null;
}
/**指定下载一个图片,如有需要可以对此方法进行扩展
* @param request
* @param response
* @param storeName
* @param contentType
* @param realName
* @throws Exception
*/
public void download(HttpServletRequest request,
HttpServletResponse response, String storeName, String contentType,
String realName) throws Exception {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
String rootDir="./resouces/pic/";
String downLoadPath = rootDir + storeName;
long fileLength = new File(downLoadPath).length();
response.setContentType(contentType);
response.setHeader("Content-disposition", "attachment; filename="
+ new String(realName.getBytes("utf-8"), "ISO8859-1"));
response.setHeader("Content-Length", String.valueOf(fileLength));
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(downLoadPath));
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {