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)
  1. sizeThreshold:设置文件上传的缓冲区的大小,默认值为10kb。
  2. 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>
  • 注意:超链接的方式,如果浏览器不能识别这种格式的文件,提示下载,如果支持该格式的文件,直接打开。

通过手动编写代码的方式实现文件的下载

  • 设置两个头和一个流:
  1. Content-Type :文件的MIME的类型
  2. Content-Disposition :浏览器支持该格式的文件,提示下载
  3. 设置代表该文件的输入流(输出流是固定 response.getOutputStream())

代码演示

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

posted @ 2019-09-28 16:54  搬砖的小伙儿  阅读(423)  评论(0)    收藏  举报
Fork me on GitHub