上传的目录打散有很多种,我们这里使用的是哈希打散,就是得到文件名称的hashCode再将hashCode转化成16进制。
创建几层目录就根据前几个字母创建目录(一个字母一层)
我们直接看代码吧
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
/*
* 上传目录打散
* 1.获得表单项的FileItem对象。
* 2.获得WEB-INF下你要保存文件的根目录
* 解决文件名是绝对目录的问题
* 3.获得文件名的hashCode并将其转化成十六进制
* 4.截取十六进制的前两位加到要保存的文件的路径并创建目录
* 5.根据目录创建文件将文件保存到指定的目录
*/
/*
* 1.创建工厂
* 2.得到解析器
* 3.得到FileItem对象的集合
*/
try {
//设置缓存大小和临时目录的路径 构造器的第一个参数是缓存的大小,第二个参数是临时文件的目录
DiskFileItemFactory factory=new DiskFileItemFactory(1024*20,new File("E:/t/temp"));
ServletFileUpload upload=new ServletFileUpload(factory);
//设置单个文件的最大值为100kb
//upload.setFileSizeMax(1024*1024);
//设置整个请求的大小限制为1m
//upload.setSizeMax(1024*1024);
List<FileItem> fileItems=upload.parseRequest(request);
System.out.println("我上传了");
FileItem fi=fileItems.get(1);
//得到根路径
String root=this.getServletContext().getRealPath("/WEB-INF/files");
//解决文件名是绝对路径问题
String fileName=fi.getName();
int index=fileName.lastIndexOf("\\");
if(index!=-1){
fileName=fileName.substring(index+1);
}
//解决文件同名问题
String uuid=UUID.randomUUID().toString().replace("-", "").toUpperCase();
String saveName=uuid+"_"+fileName;
//根据原来的文件名获得hashCode并将其转化为16进制;
int hashCode=fileName.hashCode();
String hashCode1=Integer.toHexString(hashCode);
//根据前两位和绝对路径创建文件对象 mkdirs是创建文件链方法如果没有目录就创建如果有目录就不创建。
File file=new File(root,hashCode1.charAt(0)+"/"+hashCode1.charAt(1));
file.mkdirs();
//根据要保存的目录和不会重复的文件名创建文件
File file1=new File(file,saveName);
//将文件保存到应该保存的路径
fi.write(file1);
}catch(FileUploadException e){
if(e instanceof FileUploadBase.FileSizeLimitExceededException){
request.setAttribute("msg", "单个文件的大小超过了100kb");
request.getRequestDispatcher("/form3.jsp").forward(request, response);;
}
}
catch (Exception e) {
}
}
这样就实现了目录的打散