文件上传时细节的处理


文件上传时细节的处理

在文件上传时常常出现一些错误,其中主要有以下几种:

一、    上传文件的中文乱码问题:

但我们遇到此种问题时是因为我们上传文件的编码方式是和程序不一致导致的,我们可以在我们的程序中添加这样的一条语句:upload.setHeaderEncoding("utf-8");

二、    普通输入项的乱码问题:

此种问题我们有以下两种解决办法:1、手工方式:inputValue=newString(inputValue.getBytes("ISO8859-1"),"utf-8");2、这也是最简单的方法直接在语句中添加utf-8,StringinputValue=item.getString("utf-8")。

三、    防止用户不在文件上传的输入项输入上传文件

解决此种问题我们可以添加一条:

if(!filename.trim().equals("")){

   //读取上传文件的内容,并存入本地磁盘

}语句就可以解决了。

四、    临时文件的删除问题

我们在上传文件时会产生临时文件的缓存,如果过多的临时文件不能得到及时的处理则将会导致内存溢出致使影响文件的上传,所以我们得删除临时文件,要删除临时文件我们可以有下面这条语句:

factory.setRepository(newFile(this.getServletContext().getRealPath("/temp")));

。。。

is.close();

fos.close();

item.delete();

(首先指定临时文件保存位置,然后解析临时文件,最后删除)

五、上传文件的保存位置

在我们上传的文件中如果有一些恶意程序,将会影响我们服务器的正常运行。所以我们应该将文件保存到一个安全的路径下。

服务的安全性WEB-INF文件夹下的子文件夹中或者不受服务器管理的目录。

StringsavePath =this.getServletContext().getRealPath (“WEB-INF/upload ”);

六、 多用户上传问题

多个用户上传了同名的文件,这时后面的人上传的文件就会覆盖原有的同名文件。为了能同时保存多个这样的文件我们可以用下面方法:

唯一文件名,解决办法

UUID.randomUUID().toString()

filename=UUID.randomUUID().toString()+"_"+filename;

七、  同一个文件夹存放文件过多问题:

当同一个文件夹中存放的文件过多时将会影响文件的读写速度,为防止单个目录下文件过多,影响文件读写速度,处理上传文件的程序应根据可能的文件上传总量,选择合适的目录结构生成算法,将上传文件分散存储。如利用日期等方式分布目录。

哈希目录:

利用文件名的哈希值算出二级目录。

具体做法是,取得文件名的哈希值的第四位作为一级目录(目录取值为0-15),5-8位作为二级目录(目录取值为0-15),如此能得到16个一级目录,每一个一级目录下可以有16个二级目录。

所有的文件随机分散在16*16的二级目录中,这样即使有人在短时间内上传了海量的文件,也不至于让所有的文件都存入某一个目录中

另外,也不用担心文件太过分散不易查找,因为下载时只需根据用户提供的文件名在此进行哈希运算就可以重新确定该文件的存储目录。

public String generateFilePath(String path,String filename){

           int dir1 = filename.hashCode()&0xf;     //7263723

            int dir2 = (filename.hashCode()>>4)&0xf; 

           String savepath = path + "\\" + dir1 + "\\" + dir2;

           File f = new File(savepath);

           if(!f.exists()){ 

                 f.mkdirs();       //注意必须用mkdirs() 而不是mkdir()

           }

           return savepath;

      }


八、  上传文件的大小问题

我们可以调用解析器的:upload.setFileSizeMax(1024*1024); //上传文件不能超过1M

如果超出大小,需要给用户友好提示:

try{

      ....

}catch (FileUploadBase.FileSizeLimitExceededException e) {

      request.setAttribute("message", "上传文件不能超过1M!!");

}

九、  限制上传的文件的类型

能上传哪些类型的文件

String[]arr={".jpg",".bmp",".avi"};

ListfileType=Arrays.asList(arr);

ListfileType=Arrays.asList(".jpg",".bmp","");

Stringext=filename.substring(filename.lastIndexOf("."));

if(!fileType.contains(ext)){

request.setAttribute("message","文件类型只能是jpg、bmp和avi");

request.getRequestDispatcher("/message.jsp").forward(request,response);

  return;}

十、  显示上传进度

我们可以用下面语句进行跟踪显示:

ProgressListenerprogressListener = newProgressListener() {

   publicvoidupdate(long pBytesRead, long pContentLength, int pItems) {

  System.out.println("到现在为止,  " +pBytesRead + " 字节已上传,总大小为"

         + pContentLength);

   }

};

upload.setProgressListener(progressListener);

//以KB为单位显示上传速度:

long temp =-1;  //temp注意设置为类变量

long ctemp =pBytesRead /1024;

if (mBytes ==ctemp) 

  return;

temp = mBytes;

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值