UUID.randomUUID().toString()是javaJDK(1.5以上的版本)提供的一个自动生成主键的方法,它生成的是以为32位的数字和字母组合的字符,中间还参杂着4个 - 符号。

作用:它可以作为我们表的标识列来增加,比序列增长更加方便。当然还可以用来拼接作为路径,或者图片的前缀名等等。

使用原因:

文件命名或者其他使用时间命名对于高并发会存在风险,使用UUID会规避风险,

import java.util.UUID;

UUID.randomUUID().toString();

1.作为主键ID:

public void sendSms(QuartzSmsSend quartzSmsSend) {
        UUID uuid = UUID.randomUUID();
        String id = uuid.toString().replace("-", "");
        quartzSmsSend.setId(id);
        quartzSmsSend.setCreateTime(new Timestamp(System.currentTimeMillis()));
        quartzSmsSendMapper.insertSelective(quartzSmsSend);
    }

2.作为文件路径:

MultipartFile
//@RequestParam("inputName")
MultipartFile []
JsonResultThreadLocal.set(false);
    Map<String, Object> ret = new HashMap<>(); 
       if(excel==null){
           LogUtil.info(MODULE, "发货导入文件不存在");
           throw new BusinessException("发货导入文件不存在");
   String fileId = "";
   String oriFileName = excel.getOriginalFilename();
   String[] fileNamea = oriFileName.split("\\.");
   String fileName = fileNamea[0] + "_" + UUID.randomUUID();
   String fileExtName = fileNamea[1];
   try {
      fileId = FileUtil.saveFile(excel.getBytes(), fileName, fileExtName);
      ret.put("fileId", fileId);
      ret.put("fileName", fileName);
      ret.put("fileExtName", fileExtName);
      ret.put("success", true);
   } catch (IOException e) {
         LogUtil.error(MODULE, "文件保存失败",e);
         ret.put("success", false);
   return ret;
}

在 Controller 中,有几个地方是需要我们注意的:

  • 当有多个文件上传时,如果用 MultipartFile 接口来接收,最好是用注解 @RequestParam("inputName") 指明该文件对应表单中的 input 标签的 name 属性。如果 name 都是同名的,可以使用 MultipartFile [] 文件数组来接收。
  • 注意看处理显示图片和下载图片的请求映射中,我用 {fileName}.{suffix} 这段代码将图片名和图片的后缀区分开,因为 GET 方式的 URL 请求地址中的 "." 点号会被当作通配符处理掉,有多种方式可以解决。我这种方式是一种,你也可以用 "." 转义字符来避免其通配符的作用。
  • 处理图片显示和图片下载的请求区别在于:是否设置了下载响应头 response.setHeader("Content-Disposition","attachment;fileName=" + "headPic.jpg"); 当设置了该响应头时,使用 response 输出流将会被当作附件提供给客户端下载,反之就是将流中的内容输出到页面上。

Service 层中要注意的:

  • 我们在向数据库存入图片的路径记录时,最好是将文件名和后缀名也一并记录。这里有两种方案供参考:(1)将文件名和后缀名存入一个字段(例子中用到的方案);(2)文件名存入一个字段,后缀名存入一个字段,方便后期筛选不同的文件格式,可以对图片文件进行读取和分类查询分析等操作。
  • 上传的原始文件名存在命名冲突的问题,为了避免文件名冲突被覆盖,我们可以使用 UUID 来生成唯一的文件名,如果有时候业务需要保存原始文件名的话,可以考虑在数据库表中再增加一个字段用于持久化原始的文件名。