摘要:當時想的是用免費的第三方云存儲解決方案,畢竟之前已經用過了七牛云。但是問題來了,免費的云存儲,老是出問題。所以你如果自己玩,完全可以使用免費的云存儲,要是真的商用,就考慮付費產品。
最近在做一個基于Flutter的app,算是學習新的移動端開發技術。于是就需要一個后端api接口,其中涉及到了文件上傳,特此記錄下1.為什么自己寫文件上傳
本來我計劃的是,后臺只做數據接口,不做文件存儲,畢竟自己也沒那么多的服務器資源去存儲。當時想的是用免費的第三方云存儲解決方案,畢竟之前已經用過了七牛云。
但是問題來了,免費的云存儲,老是出問題。比如七牛的,過段時間就會發現,外鏈訪問文件會失效,而且后臺文件管理面板,察看文件也看不了,很坑。
然后又看了有拍云,和騰訊云,它們提供的文件存儲都不收費,但是要后收費,當你的文件存儲超過容量時收費。這也還好,畢竟免費的,存儲圖片的話5g也夠用了,但是主要是每天的流量由限制,超出流量收費。你后期不得面臨你的應用中的圖片全部不顯示,作為定位上線的應用,是不能接受這種風險的。
所以你如果自己玩,完全可以使用免費的云存儲,要是真的商用,就考慮付費產品。但是我又窮,所以只能自己寫了。
2 后端開發(使用SpringBoot)就不貼全部的項目代碼了,只貼上傳部分的。因為使用了靜態資源訪問,所以需要加入模板引擎依賴。
org.springframework.boot spring-boot-starter-thymeleaf
因為代碼比較簡單,所以直接controller全部處理完:
package com.mike.controller; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.mike.bean.ApiResult; import com.mike.bean.FileView; import com.mike.util.ApiUtils; import com.mike.util.Tools; /** * The class UploadController */ @RestController @RequestMapping("/up") public class UploadController { @Value("${baseUrl}") private String baaseUrl; @CrossOrigin @PostMapping("/upload") public ApiResult uploadFile(@RequestParam("file") MultipartFile file){ if (file.isEmpty()) { return ApiUtils.err("你沒有選擇上傳文件"); } else if(file.getOriginalFilename().contains("..")||!file.getOriginalFilename().contains(".")){ return ApiUtils.err("文件格式有誤"); } else { String fileName = file.getOriginalFilename(); //為防止文件名重復覆蓋 fileName = fileName.replace(".", System.currentTimeMillis()+"."); Path savePath = Paths.get("src/main/resources/static/upload"); try { Files.copy(file.getInputStream(), savePath.resolve(fileName), StandardCopyOption.REPLACE_EXISTING); FileView view = new FileView(); view.setName(fileName); view.setSize(file.getSize()); view.setUrl(baaseUrl+fileName); view.setUploadDate(Tools.getCurrent()); return ApiUtils.success(view); } catch (IOException e) { e.printStackTrace(); return ApiUtils.err("對不起,上傳失敗"); } } } }
在高并發下,還是有非常小的幾率出現文件重名,所以使用時間戳也不是好的解決方案。需要能夠生成唯一識別符號,建議使用UUId。
3 前端測試(使用jquery ajax)效果:
訪問上傳后的圖片url:
4 填坑因為圖片上傳導了代碼目錄,不是服務器的目錄,所以,新上傳得圖片訪問會報404,需要重起才能訪問。為了解決這個問題,我們需要增加文件與路徑的映射關系,這樣,就不會出現404
public class FileConfig implements WebMvcConfigurer { @Value("${serverFilePath}") private String serverFilePath; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { WebMvcConfigurer.super.addResourceHandlers(registry); registry.addResourceHandler("/upload/**") .addResourceLocations(serverFilePath); } }
serverFilePath 在properties中配置:
baseUrl=http://localhost:8080/upload/ serverFilePath=file:C:/code/mike-todo/src/main/resources/static/upload/
上線的話,換成服務器上的路徑就好。
5 總結文件存儲,遠遠不像我寫的這么簡單。只是應付一般小項目足夠了,如果是大型的項目,就需要專門的文件存儲系統以及服務器端的優化。如果你有什么問題,可以留言要論。或是關注我的公眾號:mike啥都想搞,還有其他教學視頻免費領取。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/110179.html
摘要:開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權限問題前后端分離二使用完美處理權限問題前后端分離三中密碼加鹽與中異常統一處理 開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...
摘要:項目地址干貨求本腳手架主要致力于前端工程師的快速開發一鍵部署等快捷開發框架,主要目的是想讓前端工程師在一個阿里云服務器上可以快速開發部署自己的項目。 項目地址https://github.com/fanshyiis/... 干貨!求star showImg(https://segmentfault.com/img/remote/1460000017886870); 本腳手架主要致力于...
閱讀 1818·2021-11-18 13:21
閱讀 1953·2021-10-18 13:30
閱讀 1539·2021-10-12 10:13
閱讀 906·2021-10-09 09:43
閱讀 5413·2021-09-22 15:13
閱讀 3583·2021-08-11 10:22
閱讀 936·2019-08-30 13:46
閱讀 3520·2019-08-30 13:21