文件上传下载考虑的问题.doc
文本预览下载声明
1.上传文件名的中文乱码和上传数据的中文乱码
upload.setHeaderEncoding(UTF-8);//可以解决上传文件名的中文乱码
//表单为文件上传,设置request的编码无效,不能解决中文乱码,只能手工转化
a. value=new String(value.getBytes(iso8859-1),utf-8);
b. String value=item.getString(UTF-8); //上传组件commons-fileupload 作者提供了该方法
2.为了保证服务器安全,上传文件应该放到外界无法访问的目录;通常放在WEB-INF下的目录
3.为了保证每个用户上传文件的不覆盖;要写一个算法,产生唯一的文件名
public String makeFileName(String fileName){
return UUID.randomUUID().toString()+_+fileName;
}
4.为防止一个目录下面出现太多文件,使用hash算法打算存储
//savePath为 要保存的根目录;
//在根目录下产生多级目录;打散文件保存
//这样打散有个好处;可以根据文件名找到文件的真实目录
public String makePath(String fileName,String savePath){
int hashcode=fileName.hashCode();
int dir1=hashcode0xf;//拿到hashcode的1-4位 ;那么1级目录最大能产生16个目录
int dir2=(hashcode0xf0)4;//拿到hashcode的5-8位;那么2级目录最大能产生16个目录
String dir=savePath+\\+dir1+\\+dir2;
File file=new File(dir);
if(!file.exists())
{
file.mkdirs();//要调用mkdirs;多级目录
}
return dir;
}
5.要限制上传文件的最大值,可以通过(ServletFileUpload类)upload.setFileSizeMax(1024);
并通过捕获FileUploadBase.FileSizeLimitExceededException异常给用户友好提示
多个文件(总量)最大值:upload.setSizeMax(1024*10);//10KB
异常为:FileUploadBase.SizeException
6.上传文件超过设定的缓存区大小,则要设置上传文件的临时目录,
DiskFileItemFactory factory=new DiskFileItemFactory();
factory.setRepository(new File(this.getServletContext().getRealPath(/WEB-INF/temp)));
而临时目录的中的文件最后要做删除;
想确保临时文件被删除,一定要在处理完上传文件后,调用item.delete()方法;
7.限制上传文件的类型;在收到上传的文件名时,判断后缀名是否合法;
8.监听文件上传的进度;
ServletFileUpload upload=new ServletFileUpload(factory);
upload.setProgressListener(new ProgressListener(){
public void update(long pBytesRead,long pContentLength,int pItems){
System.out.println(文件大小为:+pContentLength+,当前已处理:+pItems);
}
});
//监听器一定要在下面这行代码的前面,是下面代码要调用监听器
ListFileItem list=upload.parseRequest(request);
9.在web页面中动态添加文件上传输入项
function addinput(){
var div = document.getElementById(file);
var input = document.createElement(input);
input.type=file;
=filename;
var del = document.createElement(input);
del.type=button;
del.value=删除;
显示全部