天天看點

springboot 項目打包成jar包 部署到Linux伺服器上,發現項目中上傳的一重新開機項目或者時間長了,檔案就通路不到了

本人是小白一枚,前段時間弄了一個釋出活動的功能,本地測試的時候沒什麼問題。但當我打包成jar包  部署到伺服器之後,就發現問題了。我重新開機服務或者時間過了幾天之後,釋出活動中的圖檔突然就報錯了,顯示位址錯誤。一臉蒙蔽的我。

後來也是各種百度,才知道發生了什麼。

原因:把項目部署到伺服器上之後,檔案上傳預設會在/tmp路徑中。而且 linux對’/tmp’下檔案會自動清理。

那我們可以更改下存貯檔案的位址

建立一個配置類:

public class WebMvcConfiguration implements WebMvcConfigurer {

    @Value("${out.resource.path}")
    private String path;



    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(new String[]{"/imgUrl/**"}).addResourceLocations( "file:" + path + "/");
    }
}
           

在配置檔案中添加:我的檔案是:application.properties,有的朋友可能是application.yml,下面配置檔案中限制檔案的大小看情況添加吧,因為我控制器層中有判斷檔案大小

#圖檔上傳路徑
out.resource.path=D:\\upload
#out.resource.path=file:D://upload/

#限制上傳檔案的大小
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.max-file-size=10MB
           

控制器類:

/**
     * 上傳檔案夾的名稱
     */
    @Value("${out.resource.path}")
    private String path;
    private static final String UPLOAD_DIR_NAME = "imgUrl";
    /**
     * 上傳檔案的最大大小
     */
    private static final long FILE_MAX_SIZE = 5 * 1024 * 1024;

    /**
     * 允許上傳的檔案類型
     */
    private static final List<String> FILE_CONTENT_TYPES = new ArrayList<>();

    /**
     * 初始化允許上傳的檔案類型的集合
     */
    static {
        FILE_CONTENT_TYPES.add("image/jpeg");
        FILE_CONTENT_TYPES.add("image/png");

    }


@RequestMapping("/insertImg")
    public ResponseResult<String> handleUpload(HttpSession session, @RequestParam("file") MultipartFile file) {

        // 檢查是否存在上傳檔案 > file.isEmpty()
        if (file.isEmpty()) {
            // 抛出異常:檔案不允許為空
            throw new FileEmptyException("上傳失敗!沒有選擇上傳的檔案,或選中的檔案為空");
        }
        // 檢查檔案大小 >file.getSize()
        if (file.getSize() > FILE_MAX_SIZE) {
            // 抛出異常:檔案大小超出限制
            throw new FileSizeOutOfLimitException("您上傳檔案的大小超過了:"+FILE_MAX_SIZE);
        }
        // 檢查檔案類型 > file.getContentType()
        if (!FILE_CONTENT_TYPES.contains(file.getContentType())) {
            // 抛出異常:檔案類型限制
            throw new FileTypeNotSupportException("您上傳的圖檔格式不對,隻能上傳以下格式:"+FILE_CONTENT_TYPES);
        }

        // 确定上傳檔案夾的路徑
        // session.getServletContext.getRealPath (UPLOAD_DIR_NAME)
        // > exists() > mkdirs()
        //String parentPath = session.getServletContext().getRealPath(UPLOAD_DIR_NAME);
        String parentPath = path ;
        File parent = new File(parentPath);
        if (!parent.exists()) {
            parent.mkdirs();
        }
        // 确定檔案名 > getOriginalFileName()
        String originalFileName = file.getOriginalFilename();
        int beginIndex = originalFileName.lastIndexOf(".");
        String suffox = originalFileName.substring(beginIndex);
        String fileName = System.currentTimeMillis() + "" + (new Random().nextInt(900000) + 100000) + suffox;
        // 确定檔案
        File dest = new File(parent, fileName);
        // 執行儲存檔案
        try {
            file.transferTo(dest);
            System.err.println("上傳成功");
        } catch (IllegalStateException e) {
            // 抛出異常:上傳失敗!

        } catch (IOException e) {
            // 抛出異常:上傳失敗!

        }

        // 擷取目前使用者的id
        Integer uid = getUidFromSession(session);

        // 更新頭像資料
        String avatar = "/" + UPLOAD_DIR_NAME + "/" + fileName;// 本地運作使用這個
//        iArticleService.addImgUrl(avatar);
        // 傳回頭像
        ResponseResult<String> rr = new ResponseResult<>();
        rr.setState(SUCCESS);
        rr.setData("/" + UPLOAD_DIR_NAME + "/" + fileName);
        return rr;

    }
           

目前為止我是這麼解決的,不曉得對不對,哈哈   有更好的方法的朋友們可以建議下