當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Springboot实现文件上传,并防止同文件重复上传
生活随笔
收集整理的這篇文章主要介紹了
Springboot实现文件上传,并防止同文件重复上传
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 主要流程
- 編寫接受文件上傳的Controller
- 編寫文件操作結果類
- 編寫文件操作類
- 知識總結
- 參考
主要流程
編寫接受文件上傳的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实现文件上传,并防止同文件重复上传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这三款好用又免费的配音软件千万不要错过这
- 下一篇: 如何选购一套性能优秀的电脑主机如何选购一