文件上传
1.引入依赖,导入文件上传的jar包,commons-fileupload , Maven会自动帮我们导入他的依赖包 commons-io包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
2.新建一个jsp,在jsp中有一个form表单
为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/upload/uploadResources" method="post"
enctype="multipart/form-data">
选择文件:<input type="file" name="uploadFile"><br>
<input type="submit" value="上传">
</form>
</body>
</html>
3.新建一个UploadController
@Controller
@RequestMapping("/upload")
public class UploadController {
@RequestMapping(value={"/uploadResources"},method = RequestMethod.POST)
public String uploadResources(Model model, MultipartFile uploadFile){
try {
//获取原始的文件名
String fileName=uploadFile.getOriginalFilename();
String path="F:\\attachment\\file";
File saveDir=new File(path);
if(!saveDir.exists()) saveDir.mkdirs();
File saveFile=new File(path,fileName);
uploadFile.transferTo(saveFile);
model.addAttribute("message","上传成功");
} catch (IOException e) {
e.printStackTrace();
model.addAttribute("message","上传失败");
}
return "success";
}
}
4.在springmvc.xml进行配置
<!--文件上传配置-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
<property name="defaultEncoding" value="utf-8"></property>
<!-- 上传文件大小上限,单位为字节(10485760=10M) -->
<property name="maxUploadSize" value="1024000000"></property>
</bean>
文件下载
@RequestMapping("/downLoadFile")
public ResponseEntity<byte[]> downLoadFile(String fileName)throws Exception{
String path="F:\\attachment\\file";
File downLoadFile=new File(path,fileName);
HttpHeaders headers=new HttpHeaders();
//防止下文件名有乱码
fileName=new String(fileName.getBytes("utf-8"),"ISO-8859-1");
headers.setContentDispositionFormData("attachment", fileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(downLoadFile),headers, HttpStatus.OK);
}
简单总结:
前段设置了enctype为multipart/form-data,浏览器会采用二进制流的方式来处理表单数据。
而对于文件上传的处理则涉及在服务器端解析原始的HTTP响应。在2003年,Apache Software Foundation发布了开源的Commons FileUpload组件,其很快成为Servlet/JSP程序员上传文件的最佳选择。
-
Servlet3.0规范已经提供方法来处理文件上传,但这种上传需要在Servlet中完成。
-
而Spring MVC则提供了更简单的封装。
-
Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。
-
Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:
-
CommonsMultipartResolver。因此,SpringMVC的文件上传还需要依赖Apache Commons FileUpload的组件。