前言:
之前查阅资料,发现上传下载代码层出不穷,整理一份SpringMVC上传下载笔记,springMVC中处理文件上传,基于javaWeb阶段commons组件进行简化。
环境搭建:
一、除导入Spring框架中的jar包外,额外需要
commons-io-xxx.jar
commins-fileupload-xxx.jar
二、装配CommonsMultipartResolver工具类
- bean的id必须是multipartResolver
- 可以继续为bean注入参数,设置文件上传约束,如字符集、文件上传大小限制等问题
- 使用入参后的MultipartFile中的transferTo()方法实现文件上传
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
控制器代码实现上传
@RequestMapping(value="/testUpload")
public String fileUploadMethod(@RequestParam("desc") String desc,
@RequestParam("file")MultipartFile multipartFile,
HttpSession session){
System.out.println("desc = " + desc + ", multipartFile = " + multipartFile + ", session = " + session);
try {
//获取upload的真实路径
String realPath = session.getServletContext().getRealPath("/upload");
//如upload目录不存在,就新建一个upload目录
File f = new File(realPath);
if(!f.exists()){
f.mkdir();
}
//获取文件名
String filename = multipartFile.getOriginalFilename();
File file = new File(realPath+File.separator+filename);
//实现文件上传
multipartFile.transferTo(file);
} catch (IOException e) {
e.printStackTrace();
}
return "fileuploadsuccess";
}
文件下载
-
实现文件下载步骤
- 准备下载资源文件
- 直接实现文件下载【在处理文件下载的方法中,将方法的返回值类型设置为:ResponseEntity即可。】
- ResponseEntity:封装了响应行、响应头、响应体的信息。
-
实现文件下载代码
jsp页面代码:
<h2>资源库</h2>
<a href="${pageContext.request.contextPath}/filedownload?filename=commons-io-1.4.jar">commons-io-1.4.jar</a><br>
<a href="${pageContext.request.contextPath}/filedownload?filename=hz.jpg">hz.jpg</a><br>
java控制器代码
@RequestMapping(value="/filedownload")
public ResponseEntity<byte[]> fileDownMethod(HttpServletRequest request,
String filename){
ResponseEntity<byte[]> responseEntity = null;
try {
//以绝对路径的方式,获取流资源
InputStream resourceAsStream = request.getServletContext().getResourceAsStream("/download/" + filename);
if(resourceAsStream!=null){
//将流资源转换为字节资源【响应体-文件下载资源】
byte[] bytes = IOUtils.toByteArray(resourceAsStream);
//设置响应头【设置当前文件为附件,通知浏览器下载,别打开】
MultiValueMap<String, String> headers = new HttpHeaders();
headers.add("Content-Disposition","attachment;filename="+filename);
// HttpHeaders headerss = new HttpHeaders();
// public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatus status) {
responseEntity = new ResponseEntity<>(bytes,headers, HttpStatus.OK);
}else{
System.out.println("资源不存在!!!");
}
} catch (IOException e) {
e.printStackTrace();
}
return responseEntity;
}
总结:
其中有几处是固定写法,例如通知浏览器不要打开点击下载的文件。用处实现javaee实战中的上传下载,可直接复制使用。