java UUID.randomUUID()自動生成主鍵作為Id或文件路徑


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.作為文件路徑:

/**
*
* uploadFile:上傳發貨文件. <br/>
*
* @author weijq
* @param excel
* @param model
* @param request
* @param response
* @return
* @since JDK 1.6
*/
@RequestMapping(value = "/uploadfile", method = RequestMethod.POST)
@ResponseBody
@NativeJson(true)
public Map<String,Object> uploadFile(@RequestParam(value = "excelFile", required = false) MultipartFile excel,
Model model, HttpServletRequest request, HttpServletResponse response) {
//當有多個文件上傳時,如果用 MultipartFile 接口來接收,最好是用注解 。
//@RequestParam("inputName")指明該文件對應表單中的 input 標簽的 name 屬性。如果 name 都是同名的,可以使用 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,解析用了網上其他隊友的描述:https://www.jianshu.com/p/5fc5b10fc8dc

在 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 來生成唯一的文件名,如果有時候業務需要保存原始文件名的話,可以考慮在數據庫表中再增加一個字段用於持久化原始的文件名。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM