SpringBoot系列(九)單,多文件上傳的正確姿勢

来源:https://www.cnblogs.com/swzx-1213/archive/2020/04/22/12756239.html
-Advertisement-
Play Games

本文講解了單文件,多文件上傳,然後對文件的上傳限制條件與訪問添加了一些配置。 ...


SpringBoot系列(九)分分鐘解決文件上傳

往期推薦
SpringBoot系列(一)idea新建Springboot項目

SpringBoot系列(二)入門知識

springBoot系列(三)配置文件詳解

SpringBoot系列(四)web靜態資源配置詳解

SpringBoot系列(五)Mybatis整合完整詳細版

SpringBoot系列(六)集成thymeleaf詳解版

Springboot系列(七) 集成介面文檔swagger,使用,測試

SpringBoot系列(八)分分鐘學會Springboot多種解決跨域方式

1.項目搭建與配置

 我們直接創建一個包含web依賴的項目就好了。
然後需要在配置文件配置文件上傳的一些設置。這裡使用yml文件作為配置文件,如果不懂語法的,請移步前面的系列三,裡面有詳細解釋。

server:
  port: 8095

spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 30MB
  • max-file-size 設置能接受的文件最大的大小,記得是MB,或KB
  • max-request-size 設置一次上傳的所有文件的大小。

 預設大小為1MB

 除了可以用配置文件配置還可利用java配置,如下

@Bean
public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    //上傳的單個文件最大值   KB,MB 這裡設置為10MB
    DataSize maxSize = DataSize.ofMegabytes(10);
    DataSize requestMaxSize = DataSize.ofMegabytes(30);
    factory.setMaxFileSize(maxSize);
    /// 設置一次上傳文件的總大小
    factory.setMaxRequestSize(requestMaxSize);
    return factory.createMultipartConfig();
}

 這個方法可以放在啟動類裡面,也可以自己放置在一個配置類裡面,讓項目啟動的時候能正常載入就行。

2.文件上傳

 單文件上傳,我們需要用後端接受並將文件存儲到項目裡面或者是自己定義路徑。這裡以圖片作為上傳的文件。並且將文件上傳到項目裡面。

@RestController
@RequestMapping("/file")
public class FileController {
    @PostMapping("/uploadFile")
    public String uploadFile(MultipartFile file, HttpServletRequest request)  {
        if (file.isEmpty()){
            return "上傳的文件不能為空!請重新上傳";
        }
        if (file.getSize()<=0){
            return "上傳的文件大小需要大於0kb";
        }
        System.out.println(file.getContentType());//image/png
        Date date = new Date();
        Long time = date.getTime();
        String originFileName = file.getOriginalFilename();//獲取文件原始的名稱
        String newFileName = time+originFileName;
        //獲取項目運行的絕對路徑
        String filePath = System.getProperty("user.dir");

        //由於我是創建的多模塊項目,所以獲取到的項目運行路徑為外層的項目路徑,
        // 這時候我們就需要在項目相對路徑這裡加上項目的名稱demo-upload
        String newFilePath = filePath+"\\demo-upload\\src\\main\\resources\\static\\images\\";

        //當然你也可以自己設置一個絕對路徑用於圖片上傳,文件上傳。
        //比如說:D:\\images\\
        File file1 = new File(newFilePath);

        if (!file1.exists()){
            file1.mkdirs();
        }
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(newFilePath+newFileName);
            fileOutputStream.write(file.getBytes());
            fileOutputStream.flush();
            fileOutputStream.close();
            return "localhost:8095/images/"+newFileName;
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
        return "上傳失敗";
    }
}

代碼說明:

 在代碼里,我們可以利用參數file來判斷這個文件是否為空,或者將這個文件的尾碼名拿出來,判斷這個文件的類型是否符合我們的要求,利用getContentType() 方法,如果你是上傳的png圖片,那麼列印出來的就是image/png 其他類型的圖片就是其他類型。我們為了區分圖片,可以利用當前時間的getTime方法獲得的數字來作為圖片的首碼,也可以用其他的數字或者字元串。都不想說了,碼字太累了。接下來獲取當前項目運行的路徑,由於我是創建的多模塊項目,所以這個獲取的路徑需要再加上項目名稱,後面加上我們需要上傳的文件存儲的位置,一般在resources文件下麵。然後判斷這個存儲文件的文件夾是否存在,如果不存在就需要創建一個文件。然後利用位元組流,將數據寫到文件中,返回可訪問的路徑。

 前端代碼,我直接在static目錄下麵創建了一個upload.html文件,然後我們在文件裡面寫入一下內容

<p>單文件上傳</p>
<form action="/file/uploadFile" method="POST" enctype="multipart/form-data">
    文件:<input type="file" name="file"/>
    <input type="submit" />
</form>

 它的action對應了我們controller裡面訪問上傳文件的對應的方法的路徑,method屬性是post,與後端一致。type為file的input框的name屬性需要與controller裡面的接受對象MultipartFile 一致,如果不一致的話後端無法接受到數據。如果你已經寫好後端,而前端後端參數不一致,你可以給後端參數加上一個註解。@RequestParam("file") 這個註解放在MultipartFile的前面,這樣即使你的參數名字不是file,也能正確接受到數據。

 將文件上傳之後,那個返回的路徑應該是不能直接訪問到圖片的,會顯示404,我們需可以添加以下配置。

@Configuration
public class ResourceConfigAdapter implements WebMvcConfigurer {


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //獲取文件的真實路徑
        String path = System.getProperty("user.dir")+"\\demo-upload\\src\\main\\resources\\static\\images\\";
        String os = System.getProperty("os.name");
        if (os.toLowerCase().startsWith("win")) {
            registry.addResourceHandler("/images/**").
                    addResourceLocations("file:" + path);
        }

    }
}

 這裡的java動態配置比利用的yml的配置更靈活,在知道文件要存儲的位置的情況下,可以自己在yml文件裡面加配置。然後我們運行項目,如下:

 上傳一張圖片,返回可訪問的路徑

 然後我們將這個URL複製到瀏覽器,運行,就能訪問圖片了。

 這是單文件上傳,然後可能你需要做多文件上傳,很簡單,後端做一個迴圈就行了,然後利用MultipartFile的數組接受文件,對前端做一點修改。

 @PostMapping("/uploadFiles")
public String uploadFiles(MultipartFile[] files,HttpServletRequest request) {
    StringBuilder paths = new StringBuilder();
    for (MultipartFile file:files) {
        //中間的代碼和上面的一樣
        try {
            //這裡根據實際情況修改,可以用數組
            paths.append("localhost:8095/images/"+newFileName+"\n");
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }
    return paths.toString();
}

 前端稍微修改一下

<p>多文件上傳</p>

<form action="/file/uploadFiles" method="POST" enctype="multipart/form-data">
    文件:<input type="file" name="files" multiple="multiple"/>
    <input type="submit"/>
</form>

 這就完成了多文件的上傳,在上傳的時候你需要按住Ctrl鍵,然後選中多個文件,就能上傳了。

3.總結

 本文講解了單文件,多文件上傳,然後對文件的上傳限制條件與訪問添加了一些配置。如果你覺得本文對你有用,點個贊表示一下。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • IDEA使用Spring Initializr創建項目時報錯 但在瀏覽器中輸入 https://start.spring.io 能正常訪問。 解決方式 點擊“Check connection”測試一下配置,輸入 https://start.spring.io ,提示連接成功,就說明弄好了。 ...
  • 今天在IDEA中打包Maven項目安裝到本地倉庫時報錯 Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:install (default-cli) on project api: The packagi ...
  • 背景 kafka如何支撐海量消息的集中寫入? 答案就是消息分區。 核心思想是:負載均衡,採用合適的分區策略把消息寫到不同的broker上的分區中; 其它的產品中有類似的思想。 比如monogodb, es 裡面叫做 shard; hbase叫region, cassdra叫vnode; 消息的三層結 ...
  • redis 提供了 和`aof`兩種持久化機制, + 預設開啟, 預設關閉。 當兩種持久化機制都開啟時, redis 重啟恢複數據時載入 持久化的 appendonly.aof rdb dump.rdb` 文件不會被載入到記憶體中。 開啟rdb,關閉aof 通過==redis cli== 這種方式停掉 ...
  • 列表生成式 列表生成式是 python 內置的非常強大的可以用來生成列表的生成式。在學習生成器之前先來瞭解一下列表生成式,者有利於我們隊生成器的理解。 列表生成式的語法格式如下 [exp for iter_var in iterable if_exp]另外要註意:不管你是為了Python就業還是興趣 ...
  • 我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 199. 二叉樹的右視圖 題目 給定一棵二叉樹,想象自己站在它 ...
  • 內置函數 內置函數就是python給你提供的, 拿來直接用的函數, 比如print., input等. 截止到python版本3.6.2 python一共提供了68個內置函數. #68個內置函數 # abs() dict() help() min() setattr() # all() dir() ...
  • 很多時候我們自己編寫一個類,在將它的實例在終端上列印或查看的時候,我們往往會看到一個不太滿意的結果。所以,我們可能會手動列印對象的一些屬性或者是在類里自己實現一個方法來返回我們需要的信息。 使用__str__方法實現類到字元串的轉化 class Car: def __init__(self, col ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...