錯誤原因:
Controller只能接收一次 MultipartFile的文件,
如果再將接收的 MultipartFile文件 傳遞給 其他的service ,
那么其他的 service 則獲取不到這個 MultipartFile 文件 。
因為第一次接收會將MultipartFile文件放在一個臨時區域,再將這個文件作為參數傳遞給其他的Service則會訪問不到。
解決方法:
將 MultipartFile 轉為 File 類型 傳遞即可
接下來,會通過案例來演示下這個問題的解決思路 :
演示的案例的功能描述:
用戶注冊時傳入基本信息和 "頭像圖片文件" ,
為了方便,就編寫了一個 FileController的類:用於 保存圖片並返回存儲圖片的地址 ,存儲到用戶的數據庫中
具體代碼如下:
一,用戶的服務
Controller層 : UserController.java
/** * 新增數據 * * @param user 實體 * @param file 上傳的頭像圖片 * @return 新增結果 */ @ApiOperation("新增用戶") @PostMapping("add") public ResponseData add(User user, MultipartFile file) { return this.userService.insert(user,file); }
Service層 : UserService.java
/** * 新增數據 * * @param user 實例對象 * @param file 上傳的頭像圖片 * @return 實例對象 */ ResponseData insert(User user, MultipartFile file);
Service實現層: UserServiceImpl.java
/** * 新增數據 * * @param user 實例對象 * @param file 上傳的頭像圖片 * @return 實例對象 */ @Override public ResponseData insert(User user, MultipartFile file) { //圖片上傳返回的路徑 String imgPath= ""; if (file != null) { String username = user.getName(); // 獲取文件類型 File tempFile = transferToFile.transferToFile(file); String fileType = FileUtil.getType(tempFile); String dirPath = "user/" + username + "/avatar/"; String fileName = UUID.randomUUID() + "." + fileType; /** * MultipartFile 文件只能接收一次,如果再以 MultipartFile 轉給 其他的service , 那么其他的service 則獲取不到這個 MultipartFile 文件 * 可以將 MultipartFile 轉為 File 類型 傳遞即可 */ imgPath = fileService.upload(tempFile, dirPath, fileName); } user.setAvatar(imgPath); user.setCreateTime(new Date()); this.userDao.insert(user); return new ResponseData(ResponseDataEnum.Success); }
二,文件服務
Service層: FileService.java
/** * 文件上傳。 * @param file * @param dirPath * @param fileName * @return */ public String upload(File file, String dirPath, String fileName);
Service實現層: FileServiceImpl.java
@Override public String upload(File file, String dirPath, String fileName) { dirPath = uploadPath + dirPath; fileName = dirPath + fileName; File filePath = new File(fileName); if (!filePath.getParentFile().exists()) { filePath.getParentFile().mkdirs(); } try { FileInputStream fis = null; fis = new FileInputStream(file); FileUtils.copyInputStreamToFile(fis, filePath);// 復制臨時文件到指定目錄下 } catch (Exception e) { e.printStackTrace(); } return null; }