關於《 MultipartFile 的 file.transferTo 》 的坑


錯誤原因:

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;
    }

 

 

  


免責聲明!

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



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