在写之前,先写一下关于文件上传的细节,也就是一些容易出错的地方:
1.文件必须保存在WEB-INF下。目的是为了避免浏览器直接访问到。
2.文件重名问题:我们知道,在一个服务器中,很多人上传文件以后会出现重名问题。这个时候,我们需要对其进行重命名。方法很简单,在文件名前面加上CommonUtils里的UUID即可解决问题。
3.文件的绝对路径问题。有的浏览器在保存时,会把上传文件的路径名也一并加进去。这时候我们就要通过一些方法将这些绝对路径删去。推荐使用截取的方法:
int index=fileName.lastIndexOf("/");
if(index!=-1){
fileName=fileName.subString(index+1);
}
4.文件的乱码问题:关于这个问题的解决,我还是比较倾向于使用request.setCharacterEncoding(utf-8);来解决,因为fileupload.jar的内部会调用request.getCharacterEncoding()。当然,它的优先级是比较低的,优先级较高的是servletFileUpload.setHeaderEncoding("utf-8");;
5.目录打散问题。我们知道,如果一个文件夹中存放了太多的文件,那么我们的文件夹响应就会变得很慢。所以,我们需要对文件进行分类装箱。
常用的方法有:首字符打散、时间打散,和哈希打散。本ID一般使用的哈希打散。一般的网站前两位的也差不多够用了。
6.缓存大小与临时目录。缓存大小:超出多大,才向硬盘保存!默认为10KB 临时目录就是指:向硬盘的什么目录保存。
设置方法:设置缓存大小与临时目录:new DiskFileItemFactory(20*1024, new File("F:/temp"))
7.上传文件的大小限制:当文件超出某个范围时,我们需要限制他的上传。
单个文件大小限制:FileUploadBase.FileSizeLimitExceededException
整个请求所有数据大小限制:FileUploadBase.SizeLimitExceededException
------------------------------------------------------------------我是华丽的分割线-------------------------------------------------------------------------------------------------
下面开始正文,如何进行文件上传呢?
第一步:获取DiskFileItemFactory工厂 DiskFileItemFactory factory =new DiskFileItemFactory();
第二步:通过工厂对象得到解析器 ServletFileUpload sfu=new ServletFileUpload(factory);
第三步:通过解析器获取FileItem对象的集合 List<FileItem> fileItemList=sfu.parseRequest(request);
我们知道,FileItem中有很多的方法,常用的有以下这些:
* boolean isFormField():是否为普通表单项!返回true为普通表单项,如果为false即文件表单项!
* String getFieldName():返回当前表单项的名称;
* String getString(String charset):返回表单项的值;
* String getName():返回上传的文件名称
* long getSize():返回上传文件的字节数
* InputStream getInputStream():返回上传文件对应的输入流
* void write(File destFile):把上传的文件内容保存到指定的文件中。
* String getContentType();
//获取文件表单对象
FileItem fi=fileItemList.get(1);
获取根路径,也就是我开篇说的要保存到"WEB-INF"目录下
Strng root = "/WEB-INF/files/"
获取文件名称
String fileName=fi.getName();
int index=fileName.lastIndexOf("/");
if(index!=-1){
fileName=fileName.subString(index+1);
}
String saveName=CommonsUtils.uuid()+"_"+fileName;
//保存路径
int hcode=fileName.hashCode();
File dirPath=new File(root,hcode.charAt(0)+"/"+hcode.charAt(1));
dirPath.mkdirs();
File destPath=new File(dirPath,saveName);
fi.write(destPath);
纯手打,异常处理这里就省略了。