关于文件上传的学习心得

来源:互联网 发布:淘宝五个金冠 编辑:程序博客网 时间:2024/06/05 18:06

在写之前,先写一下关于文件上传的细节,也就是一些容易出错的地方:

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);

纯手打,异常处理这里就省略了。

1 0