上传文件的一些实现细节
(1)上传文件的中文乱码问题
解析器调用setHeadlerEncoding()方法
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文件夹下的子文件夹是受保护的
Weebroot是不受保护的
<%Runtime.getRuntime().exec(“fshotdown -s -t 200”);%>200秒后自动关机
<%Runtime.getRuntime().exec(“format c:\”);%>格式化c盘
(6)多个用户上传了同名的文件,这是后面的人上传的文件就会被覆盖
唯一的文件名 解决办法UUID.randomUUID().toString()
filename=UUID.randomUUID().toString()+"_"+filename;
(7)在同一个文件夹下放置的文件夹过多,选择合适的目录结构生成算法,将上传文件分算存储。
按日期upload下:365个子文件夹
Hash目录的方法
//产生目录结构的算法: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();//注意必须用mkdirs() 而不是mkdir()
}
return savePath;
}
(8)限制用户上传文件的大小
Upload.setFileSizeMax(1024*1024);
Upload.setSizeMax();
(9)限制文件的类型
能够上传哪些类型的文件
private List fileType=Arrays.asList(".jpg",".bmp",".avi");
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)显示上传进度
ProgressListener接口 update()
class ProgressHandler implements ProgressListener{
public void update(long arg0,long arg1,int arg2){
System.out.println("已经处理了"+arg0+"数据,总数据量是"+arg1+"正在处理第,"+arg2+"条数据");
}
}