一、文件上传

1.提供表单允许用户通过表单选择文件进行上传

表单必须是POST提交

文件输入框必须有name属性,只有有name属性的输入项浏览器才会进行提交

需要设置enctype属性值为multipart/form-data

 

POST /Day15/upload.jsp HTTP/1.1

Accept: text/html, application/xhtml+xml, */*

Referer: http://localhost/Day15/upload.jsp

Accept-Language: zh-CN

User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)

Content-Type: multipart/form-data; boundary=---------------------------7de1e62806e0

Accept-Encoding: gzip, deflate

Host: localhost

Content-Length: 394

Connection: Keep-Alive

Cache-Control: no-cache

Cookie: JSESSIONID=818C14110CA7BFD1FC90610866A220E8

 

-----------------------------7de1e62806e0

Content-Disposition: form-data; name="description1"

 

xxxx

-----------------------------7de1e62806e0

Content-Disposition: form-data; name="description2"

 

zzzz

-----------------------------7de1e62806e0

Content-Disposition: form-data; name="file1"; filename="ip.txt"

Content-Type: text/plain

 

192

-----------------------------7de1e62806e0--

 

2.在Servlet中将上传的文件保存在服务器的硬盘中

DiskFileItemFactory

public DiskFileItemFactory(int sizeThreshold, java.io.File repository)


public DiskFileItemFactory()

public void setSizeThreshold(int sizeThreshold) --用来设定内存缓冲区的大小,默认是10k,小于10K,用内存缓冲区作缓存,不会用到临时文件夹


public void setRepository(java.io.File repository) --设定临时文件夹的大小,超过10K在临时文件夹创建临时文件作为缓存

 

ServletFileUpload

boolean isMultipartContent(HttpServletRequest request) 判断上传表单是否为multipart/form-data类型

List parseRequest(HttpServletRequest request) 解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。

setFileSizeMax(long fileSizeMax) 设置单个上传文件的最大值

setSizeMax(long sizeMax) 设置上传文件总量的最大值

setHeaderEncoding(java.lang.String encoding) 设置编码格式,解决上传文件名乱码问题

setProgressListener(ProgressListener pListener) 实时监听文件上传状态


FileItem

boolean isFormField() 判断FileItem是一个文件上传对象还是普通表单对象


如果是一个普通字段项可以调用:

String   getFieldName()  获得普通表单对象的name属性

String  getString(String encoding) 获得普通表单对象的value属性,可以用encoding进行编码设置


如果是一个文件上传项:

String  getName() 获得上传文件的文件名(有些浏览器会携带客户端路径)

InputStream getInputStream()  获得上传文件的输入流

delete()  在关闭FileItem输入流后,删除临时文件

 

 


文件存放应该注意的问题:

1.upload文件夹和temp文件夹都要放在web-inf目录下保护起来,防止上传入侵和访问其他用户上传资源的问题

2.文件名要拼接uuid保证唯一

3.文件要分目录存储保证同一目录下不要有过多的文件,分目录的算法有很多,介绍了一种根据hash值分目录算法



二、文件下载

response.setHeader("Content-Disposition", "p_w_upload;filename="+URLEncoder.encode(filename,"utf-8"));

response.setContentType(this.getServletContext().getMimeType(filename));//MIME类型


 

 

三、综合网盘


create database day15;

use day15;

create table netdisk(

id int primary key auto_increment,

uuidname varchar(255),

realname varchar(255),

savepath varchar(255),

ip varchar(100),

uploadtime timestamp,

description varchar(255)

);

 

 

index.jsp --- 提供 上传 下载列表

upload.jsp --- 提供上传表单,允许用户选择文件进行上传

UploadServlet --- 保存上传的文件到服务器/在数据库中保存文件相关的信息

DownListServlet --- 查询数据库表找到所有可供下载的资源信息,存入request域后带到页面显示

downlist.jsp --- 遍历request中所有资源信息,提供下载连接

DownServlet --- 下载指定id的资源