java 文件上传
MultipartResolver 是一个接口,它的实现类如下图所示,分为 CommonsMultipartResolver 类和 StandardServletMultipartResolver 类。
其中 CommonsMultipartResolver 使用 commons Fileupload 来处理 multipart 请求,所以在使用时,必须要引入相应的 jar 包;而 StandardServletMultipartResolver 是基于 Servlet 3.0来处理 multipart 请求的,所以不需要引用其他 jar 包,但是必须使用支持 Servlet 3.0的容器才可以,以tomcat为例,从 Tomcat 7.0.x的版本开始就支持 Servlet 3.0了。
1.据于CommonsMultipartResolver 的上传下载,springmvc.xml配置
<!-- 配置解析器,是因为spring容器本身底层没有对文件上传处理,因此httpservketrequest中组件的形式,非常难解析,那么配置该配置之后,spring容器,自动对httpservletrequest进行了封装MultipartServletrequest,可以配合fileupload.jar和commons.io.jar使用
导包:::
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
以及springmvc各种包,自定义选择!
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设定默认编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 设定文件上传的最大值为5MB,5*1024*1024 -->
<property name="maxUploadSize" value="5242880"></property>
<!-- 设定文件上传时写入内存的最大值,如果小于这个参数不会生成临时文件,默认为10240 -->
<property name="maxInMemorySize" value="40960"></property>
<!-- 上传文件的临时路径 -->
<property name="uploadTempDir" value="fileUpload/temp"></property>
<!-- 延迟文件解析 -->
<property name="resolveLazily" value="true"/>
</bean>
2.文件的处理,controller配置
@RequestMapping("/upload")
public String upload(HttpServletRequest request,HttpServletResponse response) throws Exception {
//创建一个通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//判断 request 是否有文件上传,即多部分请求
if(multipartResolver.isMultipart(request)){
//转换成多部分request ,由于spring的multipartResolver底层已经对request已经处理,所以以下才有强转的可能,如果没有multipartResolver处理,name在这里就有可能报错!
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
//取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while(iter.hasNext()){
//记录上传过程起始时的时间,用来计算上传时间
int pre = (int) System.currentTimeMillis();
//取得上传文件
MultipartFile file = multiRequest.getFile(iter.next());
if(file != null){
//取得当前上传文件的文件名称
String myFileName = file.getOriginalFilename();
//如果名称不为“”,说明该文件存在,否则说明该文件不存在
if(myFileName.trim() !=""){
System.out.println(myFileName);
//重命名上传后的文件名 ,用uuid防止文件重名的覆盖问题!
String path = request.getServletContext().getRealPath("/userfile")+"/"+UUID.randomUUID()+"_"+ myFileName;
//定义上传路径
System.out.println(path);
File localFile = new File(path);
//调用下面的transfer方法,实现上传!
file.transferTo(localFile);
}
}
//记录上传该文件后的时间
int finaltime = (int) System.currentTimeMillis();
System.out.println(finaltime - pre);
}
}
//上传成功后返回成功页面,根据自己的需要编写!
return "/success";
}
3.文件的下载,controller控制器的写法
@RequestMapping("/download")
//filename指的是链接所求文件的路径,一般是绝对路径,相对于服务器!
public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename,
Model model) throws Exception {
// 下载文件路径
String path = request.getServletContext().getRealPath("/userfile/");
System.out.println(filename);
File file = new File(filename);
HttpHeaders headers = new HttpHeaders();
// 下载显示的文件名,解决中文名称乱码问题
String downloadFielName = new String(filename.getBytes("UTF-8"), "iso-8859-1");
// 通知浏览器以attachment(下载方式)打开图片
headers.setContentDispositionFormData("attachment",
downloadFielName.substring(downloadFielName.lastIndexOf("_") + 1));
// application/octet-stream : 二进制流数据(最常见的文件下载)。
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}