日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Springboot实现文件上传,并防止同文件重复上传

發布時間:2023/12/3 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Springboot实现文件上传,并防止同文件重复上传 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

    • 主要流程
    • 編寫接受文件上傳的Controller
    • 編寫文件操作結果類
    • 編寫文件操作類
    • 知識總結
    • 參考

主要流程

  • 在配置文件中添加文件操作的配置,示例:
  • storage:image:#保存位置save-path: D:\classdesign-photo\images\#允許上傳的類型allow-type:- jpg- png
  • 編寫文件操作配置類,示例:
  • /*** 圖片操作配置類*/ @Configuration //用于自動獲取配置文件中storage.image中的字段 @ConfigurationProperties("storage.image") @Data public class ImageConfig {private String savePath;private List<String> allowType; }
  • 編寫接受文件上傳的Controller方法,并帶上參數MultipartFile file,如:
  • public T upload(MultipartFile file) throws IOException {...}
  • 計算文件的字節數組的MD5的值,查找數據庫中是否有重復的MD5值,防止重復上傳相同文件(可以使用Hutool計算MD5),后面有具體實現
  • 保存文件到對應文件夾,并往數據庫中添加一條記錄,數據庫只存儲文件的路徑、MD5值、上傳用戶等信息
  • 編寫接受文件上傳的Controller

    在SpringBoot接受文件比較簡單,只需要在Controller方法上加上參數MultipartFile file即可獲取前端上傳的文件

    @PostMapping("/upload")public Response<FileHandlerResult> upload(MultipartFile image) throws IOException {//自定義的通用回復類Response<FileHandlerResult> res = new Response<>();//自定義文件保存結果通用類FileHandlerResult saveRes = fileManager.saveImage(image);if(saveRes.getCode()==-1){//保存失敗res.fail(saveRes.getDesc());return res;}else if(saveRes.getCode() == 0){//圖片已存在res.setDesc(saveRes.getDesc());res.setData(saveRes);}res.success(saveRes);return res;}

    編寫文件操作結果類

    因為保存文件的過程中可能出現成功、失敗、異常三種情況,因此編寫一個通用的文件操作結果類來返回信息

    /*** 文件操作結果*/ @Data public class FileHandlerResult{/*** 狀態碼,成功:1,失敗:-1,其他:0(如:圖片已存在)*/private int code;private String md5;//文件字節數組的md5,用于防止重復上傳private String path;//文件存儲路徑private String desc;//結果狀態描述public void success(String md5, String path){this.code = 1;this.md5 = md5;this.path = path;this.desc = "保存文件成功";}public void alreadyExisted(String md5, String path){this.code = 0;this.md5 = md5;this.path =path;this.desc = "文件已存在,請勿重復保存";}public void fail(String desc){this.code = -1;this.desc = desc;}}

    編寫文件操作類

    此類中通過文件后綴來判斷文件類型的方式并不安全(文件后綴可以偽造),應通過魔數判斷,可參考:Java 通過魔數判斷上傳文件的類型

    /*** 文件操作類* 用于文件的基本*/ @Component public class FileManager<T extends BaseEntity> {@AutowiredBaseFileDao<T> dao;@AutowiredImageConfig imageConfig;//一開始編寫的文件配置類/**** @param uploadFile 從控制器接收到的文件* @return*/public FileHandlerResult saveImage(MultipartFile uploadFile) {//獲取文件類型,根據文件后綴判斷文件類型的方式不安全!String contentType = uploadFile.getContentType();String type = contentType.substring(contentType.indexOf("/")+1);//文件操作返回結果FileHandlerResult handlerResult = new FileHandlerResult();if(!imageConfig.getAllowType().contains(type)){//判斷是否為允許的文件類型handlerResult.fail("保存失敗,僅支持:"+imageConfig.getAllowType());return handlerResult;}try{File file = new File(imageConfig.getSavePath());if(!file.exists()){//創建文件夾,會自動創建父文件夾file.mkdirs();//創建目錄說明文件String descFilePath = new File(imageConfig.getSavePath()).getParentFile().toString()+"\\目錄說明.txt";try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(descFilePath)))){writer.write("此目錄為保存 xxx 項目文件的目錄");}}byte[] bytes = uploadFile.getBytes();//圖片字節數組的md5String md5 = SecureUtil.md5(uploadFile.getInputStream());List<T> list = dao.getByMd5(md5);//圖片保存路徑String path = imageConfig.getSavePath() + md5+"."+type;if(list.size() != 0){//圖片已存在handlerResult.alreadyExisted(md5, path);return handlerResult;}try(BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(path))){os.write(bytes);}handlerResult.success(md5, path);return handlerResult;}catch(FileNotFoundException e){e.printStackTrace();handlerResult.fail(e.getMessage());return handlerResult;}catch (IOException e){e.printStackTrace();handlerResult.fail(e.getMessage());return handlerResult;}} }

    知識總結

    • SpringBoot 使用MultipartFile類型的參數接受前端上傳的文件
    • 通過計算文件字節數組的MD5值,可用于防止文件重復上傳
    • 通過File類的創建目錄時:
      mkdir() 創建目錄必須確保路徑的父目錄已存在
      mkdirs()如果父文件夾不存在時并且最后一級子文件夾不存在,它就自動新建所有路經里寫的文件夾;如果父文件夾存在,它就直接在已經存在的父文件夾下新建子文件夾。

    參考

    • MultipartFile 類
    • Java 通過魔數判斷上傳文件的類型
    • SpringBoot實現多文件上傳
    • java File類mkdir()與mkdirs()方法的區別

    總結

    以上是生活随笔為你收集整理的Springboot实现文件上传,并防止同文件重复上传的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。