SpringBoot文件上傳詳解

一、前言

隨着互聯網的發展,文件上傳成為了必備的功能之一,而SpringBoot作為目前最流行的開發框架之一,為文件上傳提供了便捷而強大的解決方案。

二、使用multipart/form-data協議進行文件上傳

HTTP協議中支持文件上傳的ContentType為multipart/form-data,SpringBoot通過MultipartFile接口提供了對該協議的支持。

在Controller中使用MultipartFile實現文件上傳:


@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
    // 處理上傳文件
    return "success";
}

這裡的@RequestParam(“file”)指定了上傳文件對應的參數名,SpringBoot會自動將上傳的文件封裝成MultipartFile類型的參數傳遞給Controller方法。

上傳文件的前端代碼:



    <input type="file" name="file" />
    <input type="submit" value="上傳" />

三、限制上傳文件大小

默認情況下,SpringBoot沒有對上傳文件大小進行限制,但是可以通過配置上傳文件大小來限制用戶上傳文件的大小。

在application.properties或是application.yml文件中添加以下配置:


# 限制上傳文件大小為10MB
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

其中,max-file-size表示單個文件上傳大小,max-request-size表示總上傳大小。若超過限制,則會報FileSizeLimitExceededException異常。

四、保存上傳文件

接收到上傳文件後,一般需要將文件保存到服務器的磁盤或是雲存儲中,SpringBoot通過MultipartFile提供的transferTo方法可以從MultipartFile中獲取文件內容並保存到指定的位置。


@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
    // 獲取上傳文件名
    String fileName = file.getOriginalFilename();
    // 拼接保存文件的路徑
    String filePath = request.getSession().getServletContext().getRealPath("upload/");
    // 如果路徑不存在則創建該路徑
    File dest = new File(filePath + fileName);
    if (!dest.getParentFile().exists()) {
        dest.getParentFile().mkdirs();
    }
    try {
        // 保存文件
        file.transferTo(dest);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "success";
}

該示例中,首先獲取上傳文件的原始名稱,接着通過HttpServletRequest獲取到保存文件的路徑,之後判斷路徑是否存在,若不存在則創建該路徑,最後調用transferTo方法將文件保存到指定位置。

五、處理多文件上傳

在某些情況下,需要一次性上傳多個文件,此時可以使用SpringBoot提供的MultipartHttpServletRequest實現多文件上傳。


@PostMapping("/multiUpload")
public String multiUpload(HttpServletRequest request) {
    List files = ((MultipartHttpServletRequest) request).getFiles("file");
    for (MultipartFile file : files) {
        // 處理上傳文件
    }
    return "success";
}

該示例中,首先獲取上傳的所有文件通過MultipartHttpServletRequest的getFiles方法獲取到MultipartFile集合,之後遍歷集合處理每一個上傳文件。

六、完成代碼

上傳文件Controller的完整代碼:


@Controller
public class UploadController {

    @GetMapping("/upload")
    public String upload() {
        return "upload";
    }

    @GetMapping("/multiUpload")
    public String multiUpload() {
        return "multiUpload";
    }

    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        // 獲取上傳文件名
        String fileName = file.getOriginalFilename();
        // 拼接保存文件的路徑
        String filePath = request.getSession().getServletContext().getRealPath("upload/");
        // 如果路徑不存在則創建該路徑
        File dest = new File(filePath + fileName);
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdirs();
        }
        try {
            // 保存文件
            file.transferTo(dest);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "success";
    }

    @PostMapping("/multiUpload")
    public String multiUpload(HttpServletRequest request) {
        List files = ((MultipartHttpServletRequest) request).getFiles("file");
        for (MultipartFile file : files) {
            // 處理上傳文件
        }
        return "success";
    }
}

上傳文件的HTML代碼:





    
    文件上傳


    
        <input type="file" name="file" />
        <input type="submit" value="上傳" />
    


上傳多文件的HTML代碼:





    
    多文件上傳


    
        <input type="file" name="file" multiple="multiple"/>
        <input type="submit" value="上傳" />
    


原創文章,作者:NTXTJ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/372562.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
NTXTJ的頭像NTXTJ
上一篇 2025-04-24 06:40
下一篇 2025-04-24 06:40

相關推薦

  • 從ga角度解讀springboot

    springboot作為目前廣受歡迎的Java開發框架,其中的ga機制在整個開發過程中起着至關重要的作用。 一、ga是什麼 ga即Group Artifacts的縮寫,它是Mave…

    編程 2025-04-29
  • 使用 DRF 實現文件上傳

    文件上傳是 web 應用程序中最常見的需求之一,本文將介紹如何使用 Django Rest Framework (DRF) 來實現文件上傳。通過本文,你將學習到如何使用 DRF 中…

    編程 2025-04-28
  • SpringBoot Get方式請求傳參用法介紹

    本文將從以下多個方面對SpringBoot Get方式請求傳參做詳細的闡述,包括URL傳參、路徑傳參、請求頭傳參、請求體傳參等,幫助讀者更加深入地了解Get請求方式下傳參的相關知識…

    編程 2025-04-27
  • SpringBoot如何設置不輸出Info日誌

    本篇文章將帶您了解如何在SpringBoot項目中關閉Info級別日誌輸出。 一、為什麼要關閉Info日誌 在開發中,我們經常會使用Log4j、Logback等框架來輸出日誌信息,…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25

發表回復

登錄後才能評論