文章目录
一、文件上传
1.1 文件上传
在 Web 开发中,使用应用层协议 HTTP,通过在请求头中设置传输的内容类型 Content-Type 为 multipart/form-data; boundary=流分隔符值
来上传文件,这个流分隔符用来区分一个文件上传的开始和结束。
<%-- 文件上传 表单提交的方式--%>
<%-- 文件上传的规范:enctype="multipart/form-data" method="post"--%>
<form enctype="multipart/form-data" action="upload" method="post">
选择上传的文件:<input type="file" name="file">
<input type="submit" value="点击上传" id="btn1">
</form>
表单中的enctype 属性说明:
- application/x-www=form-urlencoded:默认方式,只处理表单域中的 value 属性值,采用这种编码方式的表单会将表单域中的值处理成 URL 编码方式。
- multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数中,不会对字符编码。
- text/plain:除了把空格转换为 “+” 号外,其他字符都不做编码处理,这种方式适用直接通过表单发送邮件。
1.2 文件下载
通过在响应消息头中设置 Content-Disposition 和 Content-Type 使得浏览器无法使用某种方式或者激活某个程序来处理 MIME 类型的文件,来让浏览器提示是否保存文件,也就是文件的下载。
response.setHeader("content-disposition","attachment;filename="+filename);
response.setContentType("application/octet-stream");
二、SpringMVC中的文件上传与下载
前提:自己在本机配置一个虚拟目录
可以在tomcat的conf目录下面的server.xml中设置:
在文件的Host标签中设置虚拟目录:
<Context path="/updatefile" docBase="E:\tomcat_test_uploadAndupdown" reloadable="true"/>
属性说明:
代码说明
元素,用于将本地文件系统中的一个目录,映射成一个可供Web浏览器访问的虚拟根目录
path属性 | 用于指定Web应用的虚拟路径 |
---|---|
docBase属性 | 用于指定该虚拟路径,所映射到的本地文件系统目录 |
reloadable | 如果设置为true,则tomcat服务器在运行时,会监视WEB-INF/classes和WEB-INF/lib目录下类的改变 |
详细可参考:
2.1 文件表单上传
1.配置文件上传解析器,限制上传文件的大小
<bean id="multipartResolver" class="com.gx.CommonsMultipartResolverPlus.PlusCommonsMultipartResolver">
</bean>
这个拦截器可以对上传文件进行一些限定:比如设置编码,设置文件上传的大小
<!--设置请求编码-->
<property name="defaultEncoding" value="UTF-8"/>
<property name="uploadTempDir" value="WEB-INF/tmp"/>
<!--设置允许单个上传文件的最大值,不要在这里配置-->
<!--<property name="maxUploadSizePerFile" value="31457280"/>-->
<!--延迟解析,在Controller中抛出异常-->
<property name="resolveLazily" value="true"/>
当文件上传大小出现异常的时候,设置resolveLazily属性为true,在拦截器中对文件上传进行限制,拦截器抛出异常,在Controller中获取异常,进行处理。
拦截器限制文件的大小(这里只写了一个preHandle方法):
public class FileUploadInterceptor implements HandlerInterceptor {
private long maxSize;
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
if (httpServletRequest != null && ServletFileUpload.isMultipartContent(httpServletRequest)) {
ServletRequestContext servletRequestContext = new ServletRequestContext(httpServletRequest);
long requestSize = servletRequestContext