文件上传
转贴自:http://my.oschina.net/nyniuch/blog/185266
实现图片上传 用户必须能够上传图片,因此需要文件上传的功能。比较常见的文件上传组件有Commons FileUpload(http://jakarta.apache.org/commons/fileupload/a>)和COS FileUpload(http://www.servlets.com/cos),Spring已经完全集成了这两种组件,这里我们选择Commons FileUpload。 由于Post一个包含文件上传的Form会以multipart/form-data请求发送给服务器,必须明确告诉DispatcherServlet如何处理MultipartRequest。首先在dispatcher-servlet.xml中声明一个MultipartResolver:
xml 代码 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置上传文件的最大尺寸为1MB --> <property name="maxUploadSize"> <value>1048576</value> </property> </bean>这样一旦某个Request是一个MultipartRequest,它就会首先被MultipartResolver处理,然后再转发相应的Controller。 在UploadImageController中,将HttpServletRequest转型为MultipartHttpServletRequest,就能非常方便地得到文件名和文件内容:
java 代码 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { // 转型为MultipartHttpRequest: MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; // 获得文件: MultipartFile file = multipartRequest.getFile(" file "); // 获得文件名: String filename = file.getOriginalFilename(); // 获得输入流: InputStream input = file.getInputStream(); // 写入文件 // 或者: File source = new File(localfileName.toString()); multipartFile.transferTo(source); }生成缩略图 (目录) 当用户上传了图片后,必须生成缩略图以便用户能快速浏览。我们不需借助第三方软件,JDK标准库就包含了图像处理的API。我们把一张图片按比例缩放到120X120大小,以下是关键代码:
java 代码 public static void createPreviewImage(String srcFile, String destFile) { try { File fi = new File(srcFile); // src File fo = new File(destFile); // dest BufferedImage bis = ImageIO.read(fi); int w = bis.getWidth(); int h = bis.getHeight(); double scale = (double) w / h; int nw = IMAGE_SIZE; // final int IMAGE_SIZE = 120; int nh = (nw * h) / w; if (nh > IMAGE_SIZE) { nh = IMAGE_SIZE; nw = (nh * w) / h; } double sx = (double) nw / w; double sy = (double) nh / h; transform.setToScale(sx, sy); AffineTransformOp ato = new AffineTransformOp(transform, null); BufferedImage bid = new BufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR); ato.filter(bis, bid); ImageIO.write(bid, " jpeg ", fo); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException( " Failed in create preview image. Error: " + e.getMessage()); } } 文件 下载 @RequestMapping(value = "/download/{fileId}",method = RequestMethod.GET) public ResponseEntity<byte[]> download(@PathVariable(value="fileId") Integer fileId,HttpServletRequest request){ FileManage file = fileManageService.findOne(fileId); try{ HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); String encodedFileName = new String(file.getFileName().getBytes("utf-8"), "ISO8859-1"); //中文文件名支持 String agent = request.getHeader("USER-AGENT"); if(agent != null && agent.indexOf("MSIE") != -1){ encodedFileName = URLEncoder.encode(file.getFileName(), "UTF-8"); } headers.set("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\""); String messageAttachmentUploadPath = FileUploadUtil.getCurrentPath(request) + ResourceUtils.getProperty(ResourceUtils.FILEUPLOAD_FILEMANAGEFILE); String path = messageAttachmentUploadPath + file.getId() + "." + file.getExtName(); file.setDownloadNum(file.getDownloadNum() + 1); fileManageService.save(file); return new ResponseEntity<byte[]>(org.apache.commons.io.FileUtils.readFileToByteArray(new File(path)), headers, HttpStatus.CREATED); }catch (IOException e) { // TODO: handle exception } return null; }