javaWeb上传之目录打散

上传的目录打散有很多种,我们这里使用的是哈希打散,就是得到文件名称的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) {
			
		}
		
	}
这样就实现了目录的打散
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值