上传文件的一些实现细节:
(1)上传文件的中文乱码:upload.setHeaderEncoding("utf-8");
(2)普通输入项的乱码问题:
手工方式:inputValue=new String(inputValue.getBytes("ISO8859-1"),"utf-8");
String inputValue=item.getString("utf-8");
(3)防止用户不在文件上传的输入项输入上传文件
if(!filename.trim().equals("")){
//读取上传文件的内容,并存入本地磁盘
}
(4)临时文件的删除问题
factory.setRepository(new File(this.getServletContext().getRealPath("/temp")));
。。。
is.close();
fos.close();
item.delete();
(5)上传文件的保存位置:服务的安全性
WEB-INF文件夹下的子文件夹中
或者不受服务器管理的目录
(6)多个用户上传了同名的文件,这时后面的人上传的文件就会覆盖原有的同名文件
唯一文件名,解决办法UUID.randomUUID().toString()
filename=UUID.randomUUID().toString()+"_"+filename;
(7)在同一个文件夹放置文件过多。
1257893 ===01001001111101101010101
& 00000000000000000001111
00000000000000000000101 5 在upload文件下键一个子文件夹5
00000100100111110110101
00000000000000000001111
00000000000000000000101===5 二级目录
upload
0 1 2 3 。。。。。。。15
0 1 2 3 。。15
16*16*1000
public String generateFilePath(String path,String filename){
//产生目录结构的算法:hash目录
int dir1=filename.hashCode() & 0x0f;//一级目录名
int dir2=filename.hashCode()>>4 & 0x0f;
String savePath=path+"\\"+dir1+"\\"+dir2;
File f=new File(savePath);
if(!f.exists()){
f.mkdirs();
}
return savePath;
}
(8)限制上传文件的大小
upload.setFileSizeMax(1024*1024);
upload.setSizeMax();
(9)限制上传的文件的类型
能上传哪些类型的文件
String[] arr={".jpg",".bmp",".avi"};
List fileType=Arrays.asList(arr);
List fileType=Arrays.asList(".jpg",".bmp","");
String ext=filename.substring(filename.lastIndexOf("."));
if(!fileType.contains(ext)){
request.setAttribute("message","文件类型只能是jpg、bmp和avi");
request.getRequestDispatcher("/message.jsp").forward(request,response);
return;
}
(10)多个文件的问题
(11)显示上传进度
ProgressListener接口 update()
(1)上传文件的中文乱码:upload.setHeaderEncoding("utf-8");
(2)普通输入项的乱码问题:
手工方式:inputValue=new String(inputValue.getBytes("ISO8859-1"),"utf-8");
String inputValue=item.getString("utf-8");
(3)防止用户不在文件上传的输入项输入上传文件
if(!filename.trim().equals("")){
//读取上传文件的内容,并存入本地磁盘
}
(4)临时文件的删除问题
factory.setRepository(new File(this.getServletContext().getRealPath("/temp")));
。。。
is.close();
fos.close();
item.delete();
(5)上传文件的保存位置:服务的安全性
WEB-INF文件夹下的子文件夹中
或者不受服务器管理的目录
(6)多个用户上传了同名的文件,这时后面的人上传的文件就会覆盖原有的同名文件
唯一文件名,解决办法UUID.randomUUID().toString()
filename=UUID.randomUUID().toString()+"_"+filename;
(7)在同一个文件夹放置文件过多。
1257893 ===01001001111101101010101
& 00000000000000000001111
00000000000000000000101 5 在upload文件下键一个子文件夹5
00000100100111110110101
00000000000000000001111
00000000000000000000101===5 二级目录
upload
0 1 2 3 。。。。。。。15
0 1 2 3 。。15
16*16*1000
public String generateFilePath(String path,String filename){
//产生目录结构的算法:hash目录
int dir1=filename.hashCode() & 0x0f;//一级目录名
int dir2=filename.hashCode()>>4 & 0x0f;
String savePath=path+"\\"+dir1+"\\"+dir2;
File f=new File(savePath);
if(!f.exists()){
f.mkdirs();
}
return savePath;
}
(8)限制上传文件的大小
upload.setFileSizeMax(1024*1024);
upload.setSizeMax();
(9)限制上传的文件的类型
能上传哪些类型的文件
String[] arr={".jpg",".bmp",".avi"};
List fileType=Arrays.asList(arr);
List fileType=Arrays.asList(".jpg",".bmp","");
String ext=filename.substring(filename.lastIndexOf("."));
if(!fileType.contains(ext)){
request.setAttribute("message","文件类型只能是jpg、bmp和avi");
request.getRequestDispatcher("/message.jsp").forward(request,response);
return;
}
(10)多个文件的问题
(11)显示上传进度
ProgressListener接口 update()