Spring MVC为文件上传提供了直接的支持,这种支持是通过即插即用的MultipartResolver实现的。
package org.springframework.web.multipart; import javax.servlet.http.HttpServletRequest; public interface MultipartResolver { boolean isMultipart(HttpServletRequest request); MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException; void cleanupMultipart(MultipartHttpServletRequest request); }我们要想使用文件上传,可以使用该接口的实现类CommonsMultipartResolver。
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--请求的编码格式--> <property name="defaultEncoding" value="UTF-8"/> <!--上传文件的大小限制--> <property name="maxUploadSize" value="1024"/> <!--上传文件的临时路径,文件上传完成后,临时目录中的临时文件会被自动清除--> <property name="uploadTempDir" value="WEB-INF"/> </bean> defaultEncoding必须与jsp文件的pageEncoding相一致测试:upload.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <html> <head> <title>上传</title> </head> <body> <form method="post" action="<c:url value="/user/uploadFile"/>" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="提交" /> </form> </body> </html>表单的类型必须为:multipart/form-data
UploadController.java
package com.smart.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; /** * Created by N3verL4nd on 2017/5/6. */ @Controller @RequestMapping("/user") public class UploadController { @RequestMapping("/upload") public String upload() { return "user/upload"; } @RequestMapping("/uploadFile") @ResponseBody public void upload(@RequestParam("file") MultipartFile file) { System.out.println(file.getOriginalFilename()); System.out.println(file.getSize()); } }
图片展示:
@RequestMapping(value = "/upload", method = RequestMethod.POST) @ResponseBody public void upload(@RequestParam("file")MultipartFile file, OutputStream out) throws IOException { out.write(file.getBytes()); out.close(); }
实现文件下载:
@RequestMapping(value = "/upload", method = RequestMethod.POST) @ResponseBody public ResponseEntity<byte[]> upload(@RequestParam("file")MultipartFile file) throws IOException { HttpHeaders headers = new HttpHeaders(); HttpStatus httpStatus = HttpStatus.OK; // headers.add("Content-Type", "image/jpeg");//图片展示 headers.add("Content-Disposition", "attachment;filename=img.png"); return new ResponseEntity<>(file.getBytes(), headers, httpStatus); }
需要加入的jar包:
commons-fileupload-*.jar commons-io-*.jar
public interface MultipartFile extends InputStreamSource { String getName();//获取表单中文件组件的名字,<input type="file" name="file" />即name的属性值 String getOriginalFilename();//获取上传文件的原名 String getContentType();//获取文件MIME类型 boolean isEmpty();//是否有上传的文件 long getSize();//获取文件的字节大小,单位为Byte byte[] getBytes() throws IOException;//获取文件数据 @Override InputStream getInputStream() throws IOException;//获取文件流 void transferTo(File dest) throws IOException, IllegalStateException;//保存上传的文件到本地 }