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