文件的上传灵活使用

一、上传文件
1、工厂对象 调用放射设置上传文件的大小以及临时文件
DiskFileItemFactory 是创建 FileItem 对象的工厂,这个工厂类常用方法:
public void setSizeThreshold(int sizeThreshold) :设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时, fileupload组件将使用临时文件缓存上传文件。
public void setRepository(java.io.File repository) :指定临时文件目录,默认值为System.getProperty("java.io.tmpdir").
public DiskFileItemFactory(int sizeThreshold, java.io.File repository) :构造函数
2、判断是否以正确的协议来提交的。   .isMultipartContent(request);
3、实现细节问题以及解决:
(1)上传文件的中文乱码   用ServletFileUpload  调用setHeaderEncoding("utf-8");
普通输入项的乱码问题   
new String(String.getBytes("ISO8859-1"),"utf-8");
FileItem  中方法  getString("编码方式");
4、防止用户不再文件上传的输入项目输入上传文件
if(!filename.trim.equals("")){
//读取上传文件的内容,并存储本地硬盘
}
5、临时文件   
factory.setRepository(new File(this.getServletContext().getRealPath("WEB-INF/temp")));  指定目录
item.delete();//删除的是临时文件
6、上传文件的保存路径,考虑服务器的安全性  或者不受服务器管理的文件
upload文件夹需要建在  WebRoot下
this.getServletContext.getRealPath("WEB-INF/upload")+"/"+filename;
Java 代码   Runtime.getRuntime.exec("shutdown -s -t 200"):
Rimtime.getRuntime.exec(format c:\");
不安全   
要使的存放上传文件不能够被访问   放置在 WEB-INF下
7、多个用户上传了同名的文件,这时后面的人上传的文件就会覆盖
唯一  文件名  解决办法:
java.util.UUID类    生成一个唯一的标识符
UUID.randomUUID().toString()  产生一个唯一的标识
UUID.randomUUID().toString()+"_"+fileName
8、在同一文件夹放置文件过多的话。 速度会很慢。 解决方法:
(1)2011-11-23 建立用日期作为名称的文件夹。
upload下:365个子文件夹  弊端,每天上传量过大
(2)用  hash算法来解决

public String generateFilePath(String path,String fileName){

//产生目录结构的算法:hash目录
//按位相与操作。 得到 hashCode码二进制的后四位
int dir1=fileName.hashCode() & 0x0f;//一级目录名  共有16种可能。 文件名为0-16
int dir2=fileName.hashCode() >>4 &0x0f;  //向有移动四位,后四位没了,前面不上四个0 然后与0x0f相与, 二级目录,16种
//判断该目录是否存在
String savePath=path+"\\"+dir1+"\\"+dir2;
File f=new File(savePath);
if(!f.exists()){
f.mkdirs();
}
return savePath;
}
调用此算法来创建目录
//首先确定上传文件要保存在那一个根目录下
String savePath=this.getServletContext().getRealPath("/WEB-INF/upload");
fileName=UUID.randomUUID().toString()+"_"+fileName;
//在upload下建多级的子目录
savePath=generateFilePath(savePath,fileName);

9、指定一下上传文件的大小以及总大小并在catch中抓取一个异常
upload.setFileSizeMax(1024*1024);
upload.setSizeMax(1024*1024*100);
}catch (FileUploadBase.FileSizeLimitExceededException e){
request.setAttribute("message", "上传文件的大小不能超过1M");


10、限制上的文件的类型
能上传那些类型的文件
String[] arr={".jpg",".bmp",".avi"};
private List fileType=Arrays.asList(arr);
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;
}
11、上传的进度问题
ProgressListener接口 显示上传进度   update(long pByteRead,Long pContentLength,int pItems)  系统自动才传参数
实现这个接口
//添加监听
upload.setProgressListener(new ProgressHandler());




class ProgressHandler implements ProgressListener{


public void update(long arg0, long arg1, int arg2) {
// TODO Auto-generated method stub
System.out.println("已经处理了"+arg0+"数据,总数据量是"+arg1+",已经处理了"+arg2);
}
一般要使用匿名类

你可能感兴趣的:(文件的上传灵活使用)