一、文件上传必要前提
1、form表单:属性enctype必须取值为multipart/form-data
2、提交请求方式:post
3、提供<input type="file" name="f1"/>的上传输入域
当form的enctype="multipart/form-data"时的正文内容:
-----------------------------7de771e40c46 分界符分成了三部分:每一部分都是用MIME协议进行描述的
Content-Disposition: form-data; name="name"
goudan
-----------------------------7de771e40c46
Content-Disposition: form-data; name="f1"; filename="a.txt"
Content-Type: text/plain
aaaaaaaaaaa
-----------------------------7de771e40c46
Content-Disposition: form-data; name="f2"; filename="b.txt"
Content-Type: text/plain
bbbbbbbbbbbbbbbbbbb
-----------------------------7de771e40c46--
二、文件上传简单案例
1.SmartUpload:早期Model1时代
2.常用的框架
commons-fileupload实现文件上传 (Apache) :struts2内部封装的文件上传也是用commons-fileupload
3.如何使用commonse-fileupload
3.1导入jar包:
commons-fileupload-xxx.jar 、commons-io-xxxx.jar
3.2编码
三、文件上传要考虑的9个问题
1、如何保证服务器的安全
把保存文件的目录放在WEB-INF下
2、中文编码问题:
a、普通字段中文值
FileItem.getString("UTF-8");
b、中文的文件名
request.setCharacterEncoding("UTF-8");
3、防止一个文件夹下的文件太多的问题
分目录存储
a、分日期创建:今天上传的文件放在以今天日期命名的文件夹中
b、用文件名的hashCode计算存放目录
4、防止同一个文件夹的文件重名
ID STORE_PATH
OLD_FILENAME NEW_FILENAME USER_ID
1 /WEB-INF/files/20140109
a.txt
UUID1.txt
1
2 /WEB-INF/files/20140109
a.txt
UUID2.txt
2
不用数据库
UUID1_a.txt
UUID2_a.txt
5、限制上传文件的大小:
a、单个文件大小
ServletFileUpload.setFileSizeMax(2*1024*1024);
b、总文件大小
ServletFileUpload.setSizeMax
6、临时文件的问题:
commons-fileupload,上传使用缓存,默认是10kb,超出10kb的上传文件,使用磁盘作为临时缓存(临时文件,存在哪里?默认是系统的临时目录)
更改临时文件存放目录:DiskFileItemFactory.setRepository(File file)
FileItem.delete():删除临时文件。在关闭流之后调用。
7、限制上传文件的类型:
只允许上传图片:
判断上传文件的扩展名
+
判断上传内容的MIME类型
8、多文件上传时,用户没传全
1
2
3
|
if
(item.getName().equals(
""
)){
continue
;
}
|
9、文件上传进度条:
异步与服务器进行通信,间隔性的通信
计算上传文件的进度比例
给ServletFileUpload注册一个监听器。
四、文件下载
1.将images文件夹下所有的文件 ,形成一个下载的文件列表(request域)--------------Servlet中
2.JSP页面(JSTL,显示到JSP页面上,并提供一个下载的链接)
3.下载操作