1、文件上传下载的原理
Web 中文件上传下载是和 HTTP 协议分不开的,想要更加深入的理解文件上传和下载,必须要对 HTTP 协议有充分认识。
文件上传
在 TCP/IP 中,最早出现的文件上传机制是 FTP,这是将文件由客户端发送到服务器的标准机制。而在 Web 开发中,使用应用层协议 HTTP,通过在请求头中设置传输的内容类型 Content-Type 为 multipart/form-data; boundary=流分隔符值
来上传文件,这个流分隔符用来区分一个文件上传的开始和结束,
在使用springMVC进行系统实现时,springMVC默认的解析器里面是没有加入对文件上传的解析的,这可以方便我们实现自己的文件上传。但如果你想使用springMVC对文件上传的解析器来处理文件上传的时候就需要在spring的applicationContext里面加上springMVC提供的MultipartResolver的申明。这样之后,客户端每次进行请求的时候,springMVC都会检查request里面是否包含多媒体信息,如果包含了就会使用MultipartResolver进行解析,springMVC会使用一个支持文件处理的MultipartHttpServletRequest来包裹当前的HttpServletRequest,然后使用MultipartHttpServletRequest就可以对文件进行处理了。Spring已经为我们提供了一个MultipartResolver的实现,我们只需要拿来用就可以了,那就是org.springframework.web.multipart.commons.CommsMultipartResolver。因为springMVC的MultipartResolver底层使用的是Commons-fileupload,所以还需要加入对Commons-fileupload.jar的支持。
一:搭建Springmvc开发环境
首先我们在eclipse中,新建一个maven项目,我这里已经有一个项目就直接用这个了netmarket。
导入所需要的jar包,名称为:commons-fileupload-xxx.jar,(xxx表示版本号)这个是apache开发的一个专门用来上传文件的工具包,其中预置了很多的文件上传的api供我们使用
1、导入jar包:
2、配置web.xml文件,在其中配置上我们的Springmv的控制分发器Servlet用于处理客户端请求的链接(我这里已经配好了直接截图)
3、上面初始化的配置文件netmk_web.xml主要是配置Springmvc的bean,这里除了需要配置视图解析器用来解析视图资源和基本的扫描包之外,还需要配置一个很重要的bean,该bean的名字是“multiPartResolver”,主要是用来处理文件的,其中可以配置的属性为上传文件的大小和编码.,也配置一个视图吧,一会写控制器的时候好返回视图
CommonsMultipartResolver允许设置的属性有:
defaultEncoding:表示用来解析request请求的默认编码格式,当没有指定的时候根据Servlet规范会使用默认值ISO-8859-1。当request自己指明了它的编码格式的时候就会忽略这里指定的defaultEncoding。 uploadTempDir:设置上传文件时的临时目录,默认是Servlet容器的临时目录。 maxUploadSize:设置允许上传的最大文件大小,以字节为单位计算。当设为-1时表示无限制,默认是-1。 maxInMemorySize:设置在文件上传时允许写到内存中的最大值,以字节为单位计算,默认是10240。可能有些人会问为什么在包里没有找到这几个属性呢,这个时候就要去看源码了,这里附上
CommonsMultipartResolver源码注释部分片段:
二:实现文件上传的功能
1、首先我们来新建一个jsp页面,命名为:uploadform.jsp写一个上传的页面form表单,其中一定要注意的是在表单的属性中添加entcypt="multipart/form-data",这表示上传的将会是二进制流的格式,以规定的二进制进行上传,便于服务器处理,使用post请求:
2:再写一个上传成功的jsp页面,主要是用来当上传成功时候跳转的页面,命名为:welcome.jsp
3:写好了jsp页面,接下来就是写我们的控制器了,Springmvc控制器,我这里就直接用managerContorller这个类,如下所示,注意其中使用MultipartFile来接受form表单传过来的file文件,MultipartFile有几个核心的api,可以供我们使用,比如 boolean isEmpty(),用来判断文件是否为空。void transferTo( File file),把文件写入目标路径地址.
这里设置视图名称,可能会问,为什么不加“/”目录和.jsp后缀,我在前面的netmk_web.xml文件中也配置了一个视图,往上翻去看。
写到这里启动服务器测试一下:
在浏览器中:
我用的断点调试,调到这里的时候,鼠标指到file参数,就会看到,参数已经传过来了
控制台显示:
处理请求前后这些是我之前写了一个拦截器,不用管它。
浏览器显示:
这个时候可能会问,那上传多个文件怎么办?很简单的,在MultipartFile后面加个中括弧就可以了
文件下载
1、
2、在控制器中:
浏览器中显示:
我设置的下载路径在d盘,本地下载很快的