java utils--5.文件上传建随机目录

1      注意事项

1.1   传文件在服务器端保存位置问题

         1.保存在可以被浏览器直接访问的位置

                   例如:商城的商品图片

                   保存在工程的WebRoot下的路径(不包含META-INF以及WEB-INF目录及其子目录)

                                    

         2.保存在不能被浏览器直接访问的位置

                   例如:付费的视频。                

                                              

                   1.工程中   META-INF WEB-INF目录及其子目录

                   2.不在工程中的服务器的磁盘目录下.

 

1.1  上传文件在同一个目录重名问题

在开发中解决这个问题,可以给上传文件起随机名称。

                           

         1.使用毫秒值

         2.使用uuid

 

1.2  同一目录下文件过多  

         只需要分目录就可以.

1.按照上传时间进行目录分离 (周、月 )

2.按照上传用户进行目录分离 ----- 为每个用户建立单独目录

3.按照固定数量进行目录分离 ------ 假设每个目录只能存放3000个文件 ,每当一个目录存满3000个文件后,创建一个新的目录

 

4.按照文件名的hashcode进行目录分离.

                                              

 

 

2      hashcode工具类

 

package com.lan.common.utils;

import java.io.File;
import java.util.UUID;

public class FileUploadUtils {

   // 得到上传文件真实名称 c:\a.txt a.txt
   public static String getRealName(String filename) {

      int index= filename.lastIndexOf("\\") + 1;

      return filename.substring(index);

   }

   // 获取随机名称 a.txt
   public static String getUUIDFileName(String filename) {
      int index= filename.lastIndexOf(".");
      if (index!= -1) {
         return UUID.randomUUID()+ filename.substring(index);
      } else {
         return UUID.randomUUID().toString();
      }
   }

   // 目录分离算法
   public static String getRandomDirectory(String filename) {

      /* 方法一
       * 
       * int hashcode =filename.hashCode();
      
       // int类型数据在内存中占32位。转换成16进制数,就得到8个16进制数
       String hex =Integer.toHexString(hashcode);
      
       return "/" +hex.charAt(0) + "/" + hex.charAt(1);*/

      int hashcode = filename.hashCode();

      System.out.println(Integer.toBinaryString(hashcode));

      int a =hashcode & 0xf;

      hashcode = hashcode >>> 4;

      int b =hashcode & 0xf;

      return "/" + a + "/" + b;

   }

} 

3                      springmvc实例

 

/**
     * 文件上传
     */
    @PostMapping(value = "/project/upload")
    @ResponseBody
    public BaseResultVo uploadFile(HttpServletRequest request) {
        BaseResultVo brv = new BaseResultVo();

        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

        //获得非上传组件
//        String tableId = multipartRequest.getParameter("tableId");

        //获得上传组件
        List<MultipartFile> fileList = multipartRequest.getFiles("file");
        MultipartFile  myfile = fileList.get(0);//获得第一个上传文件

        try {
            String originalFilename = myfile.getOriginalFilename();//获得上传文件名.后缀
            String pathTemp = request.getServletContext().getRealPath("/temp/");
            String pathNameTemp = pathTemp + originalFilename; //临时完整目录文件名.后缀

            // 得到上传文件名称
            String filename = FileUploadUtils.getRealName(originalFilename);

            // 得到随机名称.后缀
            String uuidname = FileUploadUtils.getUUIDFileName(filename);

            // 得到随机目录
            String randomDirectory = FileUploadUtils.getRandomDirectory(filename);

            // 注意:随机目录可能不存在,需要创建.
            File rd = new File(pathTemp, randomDirectory);
            if (!rd.exists()) {
                rd.mkdirs();
            }
            System.out.println(rd);

            //先把传过来的文件放在临时文件夹下,然后从文件夹中取出
            InputStream inputStream = myfile.getInputStream();
            IOUtils.copy(inputStream, new FileOutputStream(new File(rd, uuidname)));

            //删除临时文件
//            File fileTemp = new File(pathNameTemp);
//            if(fileTemp.exists() && fileTemp.isFile()) {
//                fileTemp.delete();
//            }
            brv.setResultMsg("0000", "成功");
            brv.setData("/temp" + randomDirectory + "/" + uuidname);
            return brv;
        } catch (Exception e) {
            e.printStackTrace();
            brv.setResultMsg("9999", "失败");
            return brv;
        }

    }
 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值