您的位置:首页 > 编程语言 > Java开发

SpringMVC中两种处理文件上传下载的方式.md

2017-04-26 00:00 543 查看

文件上传

总结一下Java中的文件上传处理方式,总的来说目前用过的是Commons FileUpload这个jar包。

在Spring中上传文件会被存放在一个 MultipartFile 对象中。

保存文件也很简单,只需要调用MultipartFile的 transferTo(fileObject);

1. 使用Commons FileUpload 上传文件

使用这个jar包需要加载一个依赖包:Apache Commons-io
这里可以使用Maven 进行管理方便处理这些依赖问题
在Spring-mvc的servlet配置文件中加入一下配置

<bean id="multipartResollver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="20000000"/>
</bean>

更详细的配置可以参考文档

2. 使用Servlet 3以及更高的版本进行文件上传

需要在Web.xml中对dispactherServlet进行配置,如下:

<servlet>
<servlet-name> springmvc</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name> </param-name>
<param-value> </param-value>
</init-param>
<load-on-startup> 1 </load-on-startup>
<multipart-config>
<max-file-size>789087</max-file-size> //最大文件允许上传的数量 -1表示没限制
<max-request-size> 999765</max-request-size> //最大http multipart请求的最大容量,-1表示没限制
<file-size-threshold> 300067</file-size-threshold> //大于这个值时会被写入硬盘
</multipart-config>
</servlet>

然后在Spring MVC配置文件中写入一个新的解析器

<bean id="multipartResolver" class="org.springframework.web.multipart.surpport.StandardServletMultipartResolver">

</bean>

两者配置好后,在 Controller中的handler具体实现例如下:

MultipartFile   mf = uploadFile.getMultipartFile( );
try{
File file = new File(servletRequest.getServletContext().getRealPath("/file"),  fileName);
multipartFile.transferTo(file);
} catch (IOException e) {
e.printStackTrace();
}

文件下载

为了让浏览器识别是下载一个文件,首先要设置响应的内容类型 Content-Type 为
Application/Octet-stream
.
下面简单的代码将文件发送给浏览器,如下:

//获取 文件夹的真实路径
String datapath = request.getServletContext(),getRealPath("/WEB-INF/Data");
File file = new File(datapath, "xxx.pdf" );
//判断文件是否存在
if ( file.exists ( )) {
FileInputStream fis = new FileInputStream ( file );
BufferedInputStream bis = new  BufferedInputStream ( fis );
byte[] bytes = new byte[ bis.avaliable( )];
response.setContentType ( contentType );
response.addHeader("Content-Disposition", "attachment;filename=xxx.pdf");
OutputStream os = response.getOutputStream( );
bis.read( bytes );
os.write( bytes );
}

下载文件的一个小建议:
一个简单的可以过滤直接在浏览器或者下载器中下载资源的办法
在判断request的时候判断 referer 是否为空或者是指定的URI。在返回下载文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息