spring boot圖片上傳至遠程服務器並返回新的圖片路徑


界面上傳圖片時考慮到可能會有用戶的圖片名稱一致,使用UUID來對圖片名稱進行重新生成。

//UUIDUtils

public class UUIDUtils {
    public static String getUUID(){
        return UUID.randomUUID().toString().replace("-", "");
    }
}

//FileNameUtil

 

//生成新的文件名
public class FileNameUtil {
    /**
     * 獲取文件后綴
     * @param fileName
     * @return
     */
    public static String getSuffix(String fileName){
        return fileName.substring(fileName.lastIndexOf("."));
    }

    /**
     * 生成新的文件名
     * @param fileOriginName 源文件名
     * @return
     */
    public static String getFileName(String fileOriginName){
        return UUIDUtils.getUUID() + FileNameUtil.getSuffix(fileOriginName);
    }

}
View Code

 

//FileUploadUtil

 

//圖片上傳工具類
public class FileUploadUtil {
    /**
     * 
     * @param file 文件
     * @param path   文件存放路徑
     * @param fileName 原文件名
     * @return
     */
     public static boolean upload(MultipartFile file, String path, String fileName){

            // 生成新的文件名
            String realPath = path + "/" +fileName;

            //使用原文件名
           // String realPath = path + "/" + fileName;

            File dest = new File(realPath);

            //判斷文件父目錄是否存在
            if(!dest.getParentFile().exists()){
                dest.getParentFile().mkdir();
            }

            try {
                //保存文件
                file.transferTo(dest);
                return true;
            } catch (IllegalStateException e) {             
                e.printStackTrace();
                return false;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }

        }

}
View Code

 

//application.properties

# 設置單個文件最大內存
spring.servlet.multipart.max-file-size = 50Mb 
# 設置所有文件最大內存
spring.http.multipart.max-request-size=500Mb 
# 自定義文件上傳路徑
web.upload-path=F:/blog-images/

在這里,由於我將圖片上傳至自己的本地服務器上了,而本地的磁盤都是被保護的,無法直接訪問他,所以我需要給我的圖片一個虛擬路徑,將虛擬路徑映射到此圖片存放位置即可

寫一個配置類uploadFileConfig

@Configuration
public class UploadFileConfig extends WebMvcConfigurationSupport {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry){
        registry.addResourceHandler("/images/**").addResourceLocations("file:/F:/blog-images/");
        super.addResourceHandlers(registry);
        
    }

}

之后寫Controller

    @ApiOperation("圖片上傳")
    @ApiImplicitParam(name = "file", value = "文件", required = true, dataType = "File")
    @RequestMapping(value="/upload",method= {RequestMethod.POST,RequestMethod.GET})
    @ResponseBody
    public Result upload(@RequestParam("file")MultipartFile file,HttpServletRequest request) {
        //定義要上傳文件 的存放路徑
        String localPath="F:/blog-images/";
        //獲得文件名字
        String fileName=file.getOriginalFilename();
        fileName= FileNameUtil.getFileName(fileName);
        File dest = new File(localPath + fileName);
        if(FileUploadUtil.upload(file, localPath, fileName)){
            // 將上傳的文件寫入到服務器端文件夾
            // 獲取當前項目運氣的完整url
            String requestURL = request.getRequestURL().toString();
            // 獲取當前項目的請求路徑url
            String requestURI = request.getRequestURI();
            // 得到去掉了uri的路徑
            String url = requestURL.substring(0, requestURL.length()-requestURI.length() + 1);
            url="images/"+ fileName;

            
            return  ResultUtil.success(url);

        }       
        // 返回
        return ResultUtil.error(202,"未知錯誤導致上傳失敗");
    }
View Code

自此圖片上傳就成功啦,可以用postman來測試下接口

OK,大功告成。

 


免責聲明!

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



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