文件上传时细节的处理
2011-11-24 17:42
253 查看
文件上传时细节的处理
在文件上传时常常出现一些错误,其中主要有以下几种:
一、 上传文件的中文乱码问题:
但我们遇到此种问题时是因为我们上传文件的编码方式是和程序不一致导致的,我们可以在我们的程序中添加这样的一条语句: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的二级目录中,这样即使有人在短时间内上传了海量的文件,也不至于让所有的文件都存入某一个目录中
另外,也不用担心文件太过分散不易查找,因为下载时只需根据用户提供的文件名在此进行哈希运算就可以重新确定该文件的存储目录。
八、 上传文件的大小问题
我们可以调用解析器的:upload.setFileSizeMax(1024*1024); //上传文件不能超过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;
在文件上传时常常出现一些错误,其中主要有以下几种:
一、 上传文件的中文乱码问题:
但我们遇到此种问题时是因为我们上传文件的编码方式是和程序不一致导致的,我们可以在我们的程序中添加这样的一条语句: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;
相关文章推荐
- 上传文件细节处理问题
- 上传文件细节处理问题
- 上传文件—fileupload工具—细节处理
- 上传文件细节处理问题
- 上传文件的处理细节
- 上传文件细节处理问题
- 文件上传细节处理
- 上传文件的处理细节、文件下载
- 上传文件细节处理问题
- 上传文件细节处理问题(包括中文乱码、限制文件大小、显示上传速度、删除临时文件,随机生成文件夹等)
- 上传文件的处理细节
- struts2文件上传细节
- Spring MVC 全局异常处理&文件上传
- Selenium webdriver 使用python脚本处理SWFupload 文件上传
- 安卓处理文件上传,
- 图片通用上传文件类(处理水印,缩略图)
- PHP CURL如何处理上传内存中文件,避免磁盘IO开销
- 获取请求URL、Cookie及文件上传处理
- uploadify前台上传文件,java后台处理的例子
- 文件的上传和下载 细节