Springboot MultipartFile文件上傳與下載

yml文件配置是否可以上傳及上傳附件大小

  servlet:multipart:# 允許文件上傳enabled: true# 單個文件大小max-file-size: 20MB# 設置總上傳的文件大小max-request-size: 50MB
/*** @param files* @param request* @Description 上傳文件* @Throws* @Return java.util.List* @Date 2023-08-02 12:11:02* @Author WangKun*/@PostMapping("/upload")public List<JSONObject> upload(@RequestParam("uploadFiles") MultipartFile[] files, HttpServletRequest request) {List<JSONObject> list = new ArrayList<>();for (MultipartFile file : files) {  //循環保存文件JSONObject result = new JSONObject();String msg = "";//判斷上傳文件格式String fileType = file.getContentType();// 要上傳的目標文件存放的絕對路徑String path = ClassUtils.getDefaultClassLoader().getResource("").getPath() + "imags";//文件名String fileOldName = file.getOriginalFilename();if (StringUtils.isNotBlank(fileOldName) && StringUtils.isNotEmpty(fileOldName)&& StringUtils.isNotBlank(fileType) && StringUtils.isNotEmpty(fileType)) {//獲取文件后綴名String suffixName = fileOldName.substring(fileOldName.lastIndexOf("."));//重新生成文件名String fileNewName = UUID.randomUUID() + suffixName;// 上傳if (FileUtils.upload(file, path, fileNewName)) {// 保存數據庫信息String id = addAnnex(fileNewName, fileOldName, path, fileType, file.getSize());if (StringUtils.isNotBlank(id) && StringUtils.isNotEmpty(id)) {result.put("fileName", fileNewName);result.put("id", id);msg = "文件上傳成功";}} else {msg = "文件上傳失敗";}}else{msg = "文件名或文件類型為空";}result.put("msg", msg);list.add(result);}return list;}

文件上傳到了:\target\classes\imags中

?下載:

 /*** @param id* @param response* @Description 文件下載* @Throws* @Return java.util.List<com.alibaba.fastjson2.JSONObject>* @Date 2023-08-02 13:24:41* @Author WangKun*/@GetMapping("/download")public void download(@RequestParam("id") String id, HttpServletRequest request, HttpServletResponse response) {Annex annex = annexService.selectAnnex(id);String fileName = annex.getFileNewName();String charsetCode = String.valueOf(StandardCharsets.UTF_8);try {File file = new File(annex.getFilePath() + File.separator + fileName);//中文亂碼解決String type = request.getHeader("User-Agent").toLowerCase();// 字符編碼格式if (type.indexOf("firefox") > 0 || type.indexOf("chrome") > 0) {//谷歌或火狐fileName = new String(fileName.getBytes(charsetCode), "iso8859-1");} else {//IEfileName = URLEncoder.encode(fileName, charsetCode);}// 設置響應的頭部信息response.setHeader("content-disposition", "attachment;filename=" + fileName);// 設置響應內容的類型response.setContentType(FileUtils.fileContentType(fileName) + "; charset=" + charsetCode);// 設置響應內容的長度response.setContentLength((int) file.length());// 輸出FileUtils.outStream(Files.newInputStream(file.toPath()), response.getOutputStream());} catch (Exception e) {log.error("文件下載異常{}", e.getMessage());}}

文件工具類:

/*** @Description 文件上傳工具* @Author WangKun* @Date 2023/8/2 10:28* @Version*/
@Slf4j
public class FileUtils {/*** @param file* @param path* @param fileName* @Description 保存文件* @Throws* @Return boolean* @Date 2023-08-02 12:10:39* @Author WangKun*/public static boolean upload(MultipartFile file, String path, String 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 | IOException e) {log.error("文件上傳{} 異常", e.getMessage(),e);e.printStackTrace();return false;}}/*** @param name* @Description 設置響應頭部信息* @Throws* @Return java.lang.String* @Date 2023-08-02 13:39:15* @Author WangKun*/public static String fileContentType(String name) {String result = "";String fileType = name.toLowerCase();if (fileType.endsWith(".png")) {result = "image/png";} else if (fileType.endsWith(".gif")) {result = "image/gif";} else if (fileType.endsWith(".jpg") || fileType.endsWith(".jpeg")) {result = "image/jpeg";} else if (fileType.endsWith(".svg")) {result = "image/svg+xml";} else if (fileType.endsWith(".doc")) {result = "application/msword";} else if (fileType.endsWith(".xls")) {result = "application/x-excel";} else if (fileType.endsWith(".zip")) {result = "application/zip";} else if (fileType.endsWith(".pdf")) {result = "application/pdf";} else if (fileType.endsWith(".mpeg")) { //MP3result = "audio/mpeg";} else if (fileType.endsWith(".mp4")) {result = "video/mp4";} else if (fileType.endsWith(".plain")) {result = "text/plain";} else if (fileType.endsWith(".html")) {result = "text/html";} else if (fileType.endsWith(".json")) {result = "application/json";} else{result = "application/octet-stream";}return result;}/*** @param is* @param os* @Description 文件下載輸出* @Throws* @Return void* @Date 2023-08-02 13:40:47* @Author WangKun*/public static void outStream(InputStream is, OutputStream os) {try {byte[] buffer = new byte[10240];int length = -1;while ((length = is.read(buffer)) != -1) {os.write(buffer, 0, length);os.flush();}} catch (Exception e) {log.error("文件下載{} 異常", e.getMessage(),e);} finally {try {os.close();is.close();} catch (IOException e) {log.error("關閉流{} 異常", e.getMessage(),e);e.printStackTrace();}}}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43112.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

南大通用數據庫(Gbase 8s) 創建UDR外部函數

一、在使用 date_format、from_unixtime、to_days、yearweek 函數時&#xff0c;Gbase 8s 數據庫不支持&#xff0c;可以使用創建 UDR 外部函數來實現 二、登錄命令控制臺或者使用 navicat 連接 Gbase 數據庫 這里使用 navicat &#xff0c;點擊新增連接選擇 PostGreSql 驅動…

動手學深度學習—卷積神經網絡LeNet(代碼詳解)

1. LeNet LeNet由兩個部分組成&#xff1a; 卷積編碼器&#xff1a;由兩個卷積層組成&#xff1b;全連接層密集塊&#xff1a;由三個全連接層組成。 每個卷積塊中的基本單元是一個卷積層、一個sigmoid激活函數和平均匯聚層&#xff1b;每個卷積層使用55卷積核和一個sigmoid激…

LeetCode--HOT100題(35)

目錄 題目描述&#xff1a;23. 合并 K 個升序鏈表&#xff08;困難&#xff09;題目接口解題思路1代碼解題思路2代碼 PS: 題目描述&#xff1a;23. 合并 K 個升序鏈表&#xff08;困難&#xff09; 給你一個鏈表數組&#xff0c;每個鏈表都已經按升序排列。 請你將所有鏈表合…

UDP 的報文結構以及注意事項

UDP協議 1.UDP協議端格式 1.圖中的16位UDP長度,表示整個數據報(UDP首部UDP數據)的最大長度 2.若校驗和出錯,會直接丟棄 2.UDP的報文結構 UDP報文主體分為兩個部分:UDP報頭(占8個字節)UDP載荷/UDP數據 1.源端口號 16位,2個字節 2.目的端口號 16位,2個字節 3.包長度 指示了…

sd-webui安裝comfyui擴展

文章目錄 導讀ComfyUI 環境安裝1. 安裝相關組件2. 啟動sd-webui3. 訪問sd-webui 錯誤信息以及解決辦法 導讀 這篇文章主要給大家介紹如何在sd-webui中來安裝ComfyUI插件 ComfyUI ComfyUI是一個基于節點流程式的stable diffusion的繪圖工具&#xff0c;它集成了stable diffus…

兩個list如何根據一個list中的屬性去過濾掉另一個list中不包含這部分的屬性,用流實現

你可以使用Java 8的流來實現這個功能。假設你有兩個包含對象的List&#xff0c;每個對象有一個屬性&#xff0c;你想根據一個List中的屬性值來過濾掉另一個List中不包含這個屬性值的對象。下面是一種使用流的方式來實現這個功能 import java.util.ArrayList; import java.util…

什么是閉包(closure)?為什么它在JavaScript中很有用?

聚沙成塔每天進步一點點 ? 專欄簡介? 閉包&#xff08;Closure&#xff09;是什么&#xff1f;? 閉包的用處? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅&…

IO流面試題

題目一&#xff1a; 在磁盤中新建一個文件(如果目錄結構不存在&#xff0c;則創建目錄) 文件名&#xff1a;data.txt 文件日錄&#xff1a;C:\demo\test\files (盤符不限) linux目錄~/demo/test/files 題二 在新建的data.txt中添加如下內容&#xff1a; 張三,測試,2019-02-18 …

windows10 安裝WSL2, Ubuntu,docker

AI- 通過docker開發調試部署ChatLLM 閱讀時長&#xff1a;10分鐘 本文內容&#xff1a; window上安裝ubuntu虛擬機&#xff0c;并在虛擬機中安裝docker&#xff0c;通過docker部署數字人模型&#xff0c;通過vscode鏈接到虛擬機進行開發調試.調試完成后&#xff0c;直接部署在云…

優漫動游零基礎如何學習好UI設計

智能時代的來臨&#xff0c;很多企業都越來越注重用戶體驗這一塊&#xff0c;想要有一個吸引用戶的好頁面&#xff0c;UI設計師崗位不可或缺&#xff0c;如今越來越多的人想要學習UI設計技術&#xff0c;那么對于零基礎小白如何學習好UI設計呢? 零基礎小白如何學習好UI設計…

變更通知在開源SpringBoot/SpringCloud微服務中的最佳實踐

目錄導讀 變更通知在開源SpringBoot/SpringCloud微服務中的最佳實踐1. 什么是變更通知2. 變更通知的場景分析3. 變更通知的技術方案3.1 變更通知的技術實現方案 4. 變更通知的最佳實踐總結5. 參考資料 變更通知在開源SpringBoot/SpringCloud微服務中的最佳實踐 1. 什么是變更通…

Ubuntu在自己的項目中使用pcl

1、建立一個文件夾&#xff0c;如pcl_demos&#xff0c;里面建立一個.cpp文件和一個cmake文件 2、打開終端并進入該文件夾下&#xff0c;建立一個build文件夾存放編譯的結果并進入該文件夾 3、對上一級進行編譯 cmake .. 4、生成可執行文件 make 5、運行該可執行文件 6、可視…

最強自動化測試框架Playwright(30)-JS句柄

在 Playwright 中&#xff0c;JSHandle 是一個表示瀏覽器中 JavaScript 對象的類。它提供了與網頁中的 JavaScript 對象進行交互和操作的方法。 可以通過調用 Playwright中的 evaluateHandle 或 evaluate 方法來獲取 JSHandle from playwright.sync_api import sync_playwrig…

微服務中間件-分布式緩存Redis

分布式緩存 a.Redis持久化1) RDB持久化1.a) RDB持久化-原理 2) AOF持久化3) 兩者對比 b.Redis主從1) 搭建主從架構2) 數據同步原理&#xff08;全量同步&#xff09;3) 數據同步原理&#xff08;增量同步&#xff09; c.Redis哨兵1) 哨兵的作用2) 搭建Redis哨兵集群3) RedisTem…

金融語言模型:FinGPT

項目簡介 FinGPT是一個開源的金融語言模型&#xff08;LLMs&#xff09;&#xff0c;由FinNLP項目提供。這個項目讓對金融領域的自然語言處理&#xff08;NLP&#xff09;感興趣的人們有了一個可以自由嘗試的平臺&#xff0c;并提供了一個與專有模型相比更容易獲取的金融數據。…

Java根據List集合中的一個字段對集合進行去重

利用HashSet 創建了一個HashSet用于存儲唯一的字段值&#xff0c;并創建了一個新的列表uniqueList用于存儲去重后的對象。遍歷原始列表時&#xff0c;如果字段值未在HashSet中出現過&#xff0c;則將其添加到HashSet和uniqueList中。 List<Person> originalList new Ar…

VS2015項目中,MFC內存中調用DLL函數(VC6生成的示例DLL)

本例主要講一下&#xff0c;用VC6如何生成DLL&#xff0c;用工具WinHex取得DLL全部內容&#xff0c;VC2015項目加載內存中的DLL函數&#xff0c;并調用函數的示例。 本例中的示例代碼下載&#xff0c;點擊可以下載 一、VC6.0生成示例DLL項目 1.新建項目&#xff0c;…

mysql中的is null和空字符串

相比于oracle&#xff0c;mysql中的is null 和空坑就沒那么多&#xff0c;直接寫就行。 不為空 and (username is not null and username !)注&#xff1a; 不為空中間用的是and。 為空 and (username is null or username !)注&#xff1a; 為空中間用的是or。

java應用運行在docker,并且其他組件也在docker

docker啟動redis容器 # create redis docker run -d --name redis-container -p 6379:6379 redis:latest創建java 應用 dockerfile FROM openjdk:17##Pre-create related directories RUN mkdir -p /data/etax/ms-app WORKDIR /data/etax/ms-appEXPOSE 10133 COPY ./target…

SQL Server Express 自動備份方案

文章目錄 SQL Server Express 自動備份方案前言方案原理SQL Server Express 自動備份1.創建存儲過程2.設定計劃任務3.結果檢查sqlcmd 參數說明SQL Server Express 自動備份方案 前言 對于許多小型企業和個人開發者來說,SQL Server Express是一個經濟實惠且強大的數據庫解決方…