一、文件上传概述
1、文件上传必须满足的条件
a、页面表单的method必须是post
b、页面表单的enctype必须是multipart/form-data类型的
c、表单中提供<input type=”file”/>上传输入域
注意:不适合上传特别大的文件
2、请求正文内容的获取
二、文件上传原理分析
enctype=”multipart/form-data”
可以用流的方式获取请求正文内容,进一步的解析。
三、借助第三方开发包实现文件上传
Servlet3.0内部提供了对文件上传的支持
commons-fileupload(apache)
依赖:commons-io
1、拷贝jar包:
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
2、fileupload组件的解析过程
3、主要的类和主要的方法
l DiskFileItemFactory:产生存在磁盘上的FileItem工厂
public void setSizeThreshold(int sizeThreshold):
设置上传时用的缓存大小。默认是10KB。
public void setRepository(File repository):
设置上传文件超出缓存大小的磁盘临时文件的存放目录。默认是系统的临时文件存放目录。
构造方法:
DiskFileItemFactory():使用默认缓存,默认的临时文件存放目录
DiskFileItemFactory(intsizeThreshold, File repository) :使用自己制定的缓存和临时文件的存放目录。
l ServletFileUpload:核心的解析请求的类
public static final booleanisMultipartContent(javax.servlet.http.HttpServletRequest request):判断用户的请求正文是否是multipart/form-data类型。
public ListparseRequest(javax.servlet.http.HttpServletRequest request):解析请求对象,得到所有的表单输入域(每一个域用FileItem表示)
l FileItem:代表每一个表单输入域
4、上传代码
四、文件上传时需要考虑的几个问题
1、如何保证服务器的安全
解决方案:把存放上传文件的目录放到WEB-INF目录下
2、中文乱码问题
2.1普通字段的中文乱码
FileItem.getString(encoding):编码要与浏览器的编码一致
2.2上传文件名是中文
解决方案:request.setCharacterEncoding(encoding):通知服务器,请求正文的编码类型
3、同一个文件夹下的同名文件被覆盖的问题
解决方案:文件名唯一即可
a.txt----->UUID.randomUUID().toString()_a.txt
4、上传文件分目录存储
解决方案:
1、分用户名目录存储
2、按照日期分目录存储(采用的较多)
3、按照文件名的hashCode计算存放目录(二级目录)
5、限制文件的上传大小
5.1限制单个文件上传大小
5.2限制总文件上传大小(多个上传输入域)
6、限制上传文件的类型
MIME类型+文件的扩展名
只允许上传图片:MIME设置(大类型/小类型)
7、临时文件的处理
超出缓存会采用磁盘临时文件来缓存
l FileItem.writer():使用该方法处理上传。临时文件会自动清理。(推荐)
需要手工删除:FileItem.delete()方法