Upload&Download
Upload
文件上传的技术
- JSPSmartUpload :应用在JSP上的文件上传和下载的组件。
- FileUpload :应用在Java环境上的文件上传的功能。
- Servlet3.0 :提供文件上传的功能
文件上传的三个要素
- 表单的提交的方式需要是POST
- 表单中需要有<input type=”file”>元素,需要有name属性和值。
- 表单enctype=”multipart/form-data”
抓包分析(enctype属性)
- 没有设置enctype属性
POST /web06/jsp/upload.jsp HTTP/1.1 Accept: text/html, application/xhtml+xml, */* X-HttpWatch-RID: 22006-10011 Referer: http://localhost:8080/web06/jsp/upload.jsp Accept-Language: zh-CN User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: localhost:8080 Content-Length: 53 DNT: 1 Connection: Keep-Alive Cache-Control: no-cache Cookie: JSESSIONID=D51DCB996556C94861B2C72C4D978010 info=info&upload=C%3A%5CUsers%5Cjt%5CDesktop%5Caa.txt
***** 注意:没有上传的文件的具体的内容👆。
- 设置enctype属性
POST /web06/jsp/upload.jsp HTTP/1.1 Accept: text/html, application/xhtml+xml, */* X-HttpWatch-RID: 22006-10026 Referer: http://localhost:8080/web06/jsp/upload.jsp Accept-Language: zh-CN User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko Content-Type: multipart/form-data; boundary=---------------------------7e139d10110a64 Accept-Encoding: gzip, deflate Host: localhost:8080 Content-Length: 322 DNT: 1 Connection: Keep-Alive Cache-Control: no-cache Cookie: JSESSIONID=D51DCB996556C94861B2C72C4D978010 -----------------------------7e139d10110a64 Content-Disposition: form-data; name="info" aaa -----------------------------7e139d10110a64 Content-Disposition: form-data; name="upload"; filename="C:\Users\jt\Desktop\aa.txt" Content-Type: text/plain hello world!!! -----------------------------7e139d10110a64--
文件上传的原理分析

Servlet文件上传入门



文件上传的API
DiskFileItemFactory磁盘文件项工厂
构造方法:

- DiskFileItemFactory()
- DiskFileItemFactory(int sizeThreshold,File repostory)
- sizeThreshold:设置文件上传的缓冲区的大小,默认值为10kb。
- repository:设置文件上传过程中产生临时文件存放的路径。
方法:

- setSizeThreshold():设置缓冲区的大小
- setRepository():设置临时文件存放的路径
ServletFileUpload核心解析类
构造方法:

ServeltFileUpload(FileItemFactory fileItemFactory);
方法:

是用来判断表单的enctype属性是否正确。

解析Request对象,返回一个List集合(每个部分的对象FileItem)

设置当个文件的大小

设置上传的文件的总大小

设置中文文件名上传的乱码的问题。

设置监听文件上传的进度
FileItem文件项
构造方法

判断表单项是普通项还是文件上传项。如果为true代表是普通项
普通项的方法:

获得普通项的名称

获得普通项的值
文件上传项:

获得文件上传的文件名的方法

获得文件上传的文件内容的方法

获得文件上传的文件的大小

删除文件上传过程中的临时文件
JS控制多文件上传

文件上传兼容浏览器问题
如果使用IE老版本的浏览器出现一个文件名称获取错误问题。IE老版本获取文件名称的时候,会带有路径。

问题解决

本Demo产生唯一文件名(有点low)

同一个目录下存放文件过多的问题及解决
按目录分离算法 :按照某种特定算法进行分离。
- 上传一个文件,得到一个唯一的文件名。
- 唯一文件名获取其hashCode值。-----int类型的值(32位)
- 让hashCode的值 & 0xf;-----得出的这个值作为一级目录。
- 让hashCode右移4位 & 0xf;----得出的这个值作为二级目录。
- 以此类推。
分析算法:


Download
文件下载的方式
使用超链接的方式实现文件的下载
- 在<a href=”文件的路径”>超链接</a>
- 注意:超链接的方式,如果浏览器不能识别这种格式的文件,提示下载,如果支持该格式的文件,直接打开。
通过手动编写代码的方式实现文件的下载
- 设置两个头和一个流:
- Content-Type :文件的MIME的类型
- Content-Disposition :浏览器支持该格式的文件,提示下载
- 设置代表该文件的输入流(输出流是固定 response.getOutputStream())
代码演示


遍历某文件夹及其子文件夹下所有文件(jsp中使用Java队列)



浙公网安备 33010602011771号