Spring web模块支持文件的上传与下载,下面两个章节分别介绍对应的内容
主要用到commons-fileupload-1.3.jar以及commons-io-2.4.jar.
如果使用Maven,可添加如下配置
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
首先要使对应的form支持文件的提交,增加enctype属性
<fm:form method="POST" modelAttribute="NewSpitter" enctype="multipart/form-data">
再添加如下代码块到form中
<tr> <td><label for="pic">Pic:</label></td> <td><input name="pic" type="file"></td> </tr>
添加@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();
}
<!-- 上传拦截,如最大上传值及最小上传值 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- one of the properties available; the maximum file size in bytes --> <property name="maxUploadSize" value="100000" /> </bean>
文件的下载相对比较简单,只需要修改对应的控制器便可.为了演示,在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))) { bos.write(buff, 0, bytesRead); } bis.close(); bos.close(); }