最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析如何在SpringBoot上傳中將MultipartFile轉(zhuǎn)File對象

 更新時間:2025年08月07日 08:29:12   作者:Micro麥可樂  
在我們開發(fā) Spring Boot Web 應(yīng)用中,文件上傳通常通過 MultipartFile 接口接收,但有時我們需要將 MultipartFile 轉(zhuǎn)成標(biāo)準(zhǔn)的 java.io.File 對象,下面我們就來看看具體實現(xiàn)吧

1. 前言

在我們開發(fā) Spring Boot Web 應(yīng)用中,文件上傳通常通過 MultipartFile 接口接收。但有時我們需要將 MultipartFile 轉(zhuǎn)成標(biāo)準(zhǔn)的 java.io.File 對象,便于與依賴本地文件 API 的第三方庫(如 Apache POI、Tika、圖像處理庫等)集成,也便于做臨時文件存儲與后續(xù)處理

你可能會有以下需求:

  • 第三方庫依賴:如某些 PDF 解析、辦公室文檔處理 API 只接受 File 對象或文件路徑
  • 文件處理:對上傳文件進行臨時處理、壓縮、分析;
  • 臨時緩存:需要將上傳文件緩存在本地以做異步處理、批量掃描等

那么我們就需要將 MultipartFile 轉(zhuǎn)換 java.io.File 對象,本文博主將講解常見的四種方案,希望小伙伴們閱后能快速掌握。

2. 常見4種轉(zhuǎn)換方案

2.1 使用 transferTo() 方法

transferTo(File) — Spring推薦 最簡潔高效

此方式直接調(diào)用 MultipartFile.transferTo(dest),將上傳內(nèi)容寫入指定文件。

public File convertByTransferTo(MultipartFile multipartFile,String destPath) throws IOException {

    File destFile = new File(destPath);
    // 如果目標(biāo)目錄不存在,則創(chuàng)建
    File parent = destFile.getParentFile();
    if (parent != null && !parent.exists()) {
        parent.mkdirs();
    }
    multipartFile.transferTo(destFile);
    return destFile;
}

優(yōu)點:代碼簡潔,直接寫入;

缺點:必須確保 MultipartFile 未被多次使用,且目標(biāo)路徑可寫

2.2 使用FileUtils.copyInputStreamToFile

需要引入 Apache Commons IO 依賴

<!-- 在 pom.xml 中添加依賴 -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

調(diào)用 commons-io 中提供的 FileUtils 工具類

public static File convertWithCommonsIO(MultipartFile multipartFile, String destPath) throws IOException {

    File dest = new File(destPath);
    FileUtils.forceMkdirParent(dest);
    FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), dest);
    return dest;
}

優(yōu)點:極簡;FileUtils 自動管理目錄創(chuàng)建與流關(guān)閉

缺點:需額外 commons-io 依賴

2.3 使用 Java NIO Files.copy

java.nio.file.Files 提供了便捷的方法,將 InputStream 復(fù)制到路徑(Path)上

public static File convertWithNio(MultipartFile multipartFile, String destPath) throws IOException {

    File destFile = new File(destPath);
    // 如果目標(biāo)目錄不存在,則創(chuàng)建
    File parent = destFile.getParentFile();
    if (parent != null && !parent.exists()) {
        parent.mkdirs();
    }

    try (var in = multipartFile.getInputStream()) {
        return Files.copy(in, destFile, StandardCopyOption.REPLACE_EXISTING);
    }
}

優(yōu)點:代碼簡潔;使用現(xiàn)代 NIO API,可選覆蓋或保留原有文件

缺點:需管理目錄和文件刪除

2.4 手動處理輸入輸出流

手動通過 InputStream/OutputStream 讀取 MultipartFile 的內(nèi)容,并寫入 Java File。適用于任何實現(xiàn)

public static File convertWithStream(MultipartFile multipartFile) throws IOException {
    // 創(chuàng)建臨時文件,JVM 退出時會嘗試刪除
    String prefix = "upload_";
    String suffix = "_" + multipartFile.getOriginalFilename();
    File tempFile = File.createTempFile(prefix, suffix);
    try (InputStream in = multipartFile.getInputStream();
         OutputStream out = new FileOutputStream(tempFile)) {
        byte[] buffer = new byte[8192];
        int len;
        while ((len = in.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
    }
    return tempFile;
}

優(yōu)點:最通用、可精細控制;無論底層如何實現(xiàn)都可工作

缺點:需要自行管理臨時文件刪除

3. 全局封裝及測試

基于上述的4種方案,我們可以整理成一個工具類,方便后續(xù)的使用以及測試

import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;

public class FileConverter {

    // 方法1: 使用transferTo()方法 (Spring推薦)
    public static File convertUsingTransferTo(MultipartFile file) throws IOException {
        File convertedFile = createTempFile(file);
        file.transferTo(convertedFile);
        return convertedFile;
    }

    // 方法2: 使用Apache Commons IO工具類
    public static File convertUsingCommonsIO(MultipartFile file) throws IOException {
        File convertedFile = createTempFile(file);
        try (InputStream inputStream = file.getInputStream()) {
            FileUtils.copyInputStreamToFile(inputStream, convertedFile);
        }
        return convertedFile;
    }

    // 方法3: 使用Java NIO的Files.copy()
    public static File convertUsingNIO(MultipartFile file) throws IOException {
        File convertedFile = createTempFile(file);
        Path targetPath = convertedFile.toPath();
        Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);
        return convertedFile;
    }

    // 方法4: 手動處理輸入輸出流
    public static File convertManually(MultipartFile file) throws IOException {
        File convertedFile = createTempFile(file);
        try (InputStream inputStream = file.getInputStream()) {
            Files.copy(inputStream, convertedFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
        }
        return convertedFile;
    }

    // 創(chuàng)建臨時文件 小伙伴們可以根據(jù)需求改寫
    private static File createTempFile(MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename();
        String prefix = originalFilename != null ? 
                        originalFilename.substring(0, Math.min(originalFilename.length(), 10)) : 
                        "upload_";
        String suffix = originalFilename != null && originalFilename.contains(".") ?
                        originalFilename.substring(originalFilename.lastIndexOf('.')) : 
                        ".tmp";
        
        return File.createTempFile(prefix, suffix);
    }
}

構(gòu)建測試Controller

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public ResponseEntity<Map<String, Object>> handleFileUpload(
            @RequestParam("file") MultipartFile file) throws IOException {
        
        Map<String, Object> result = new HashMap<>();
        
        // 使用方法1
        File file1 = FileConverter.convertUsingTransferTo(file);
        result.put("method1", getFileInfo(file1));
        
        // 使用方法2
        File file2 = FileConverter.convertUsingCommonsIO(file);
        result.put("method2", getFileInfo(file2));
        
        // 使用方法3
        File file3 = FileConverter.convertUsingNIO(file);
        result.put("method3", getFileInfo(file3));
        
        // 使用方法4
        File file4 = FileConverter.convertManually(file);
        result.put("method4", getFileInfo(file4));
        
        return ResponseEntity.ok(result);
    }

    private Map<String, Object> getFileInfo(File file) {
        Map<String, Object> info = new HashMap<>();
        info.put("path", file.getAbsolutePath());
        info.put("size", file.length() + " bytes");
        info.put("exists", file.exists());
        return info;
    }
}

4. 方案對比

方法依賴適用場景臨時文件控制
transferTo(File)Spring MVC大多數(shù)情況首選由 Spring 管理
Apache Commons IOCommons IO已使用Commons IO的項目簡便
手動流復(fù)制Java標(biāo)準(zhǔn)庫需要精細控制流的情況全程可控
Files.copy (NIO)Java標(biāo)準(zhǔn)庫高性能需求場景可控

博主推薦:

如果追求最簡潔、且 Spring MVC 默認實現(xiàn)足夠可靠,推薦 transferTo

如果項目已有 Commons IO,想用最少的代碼量,則選擇 Apache Commons IO

5. 結(jié)語

Spring BootMultipartFile 轉(zhuǎn) File 有多種實現(xiàn)方式,各有適用場景。對于大多數(shù)應(yīng)用,推薦使用 Spring 自帶的 transferTo() 方法,它在簡潔性和性能之間取得了良好平衡。當(dāng)項目已包含Apache Commons IO時,使用 FileUtils.copyInputStreamToFile 也是不錯的選擇。

到此這篇關(guān)于淺析如何在SpringBoot上傳中將MultipartFile轉(zhuǎn)File對象的文章就介紹到這了,更多相關(guān)SpringBoot MultipartFile轉(zhuǎn)File對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決Properties屬性文件中的值有等號和換行的小問題

    解決Properties屬性文件中的值有等號和換行的小問題

    這篇文章主要介紹了解決Properties屬性文件中的值有等號有換行的小問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java線程之間數(shù)據(jù)傳遞的實現(xiàn)示例(4種)

    Java線程之間數(shù)據(jù)傳遞的實現(xiàn)示例(4種)

    我們經(jīng)常會遇到父子線程數(shù)據(jù)傳遞(非調(diào)用參數(shù))的場景,本文主要介紹了Java線程之間數(shù)據(jù)傳遞的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Java后端向前端返回文件流實現(xiàn)下載功能

    Java后端向前端返回文件流實現(xiàn)下載功能

    后端可以使用Java中servlet提供的HttpServletResponse,核心步驟是要設(shè)置響應(yīng)的數(shù)據(jù)類型,設(shè)置為某一類文件類型或二進制格式,以及響應(yīng)頭,然后用ServletOutputStream將文件以流的形式發(fā)送到前端,本文介紹Java后端向前端返回文件流實現(xiàn)下載功能,感興趣的朋友一起看看吧
    2023-12-12
  • 如何解決Eclipse找不到或無法加載主類問題

    如何解決Eclipse找不到或無法加載主類問題

    這篇文章主要介紹了如何解決Eclipse找不到或無法加載主類問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java的分支結(jié)構(gòu)與循環(huán)你知道多少

    Java的分支結(jié)構(gòu)與循環(huán)你知道多少

    這篇文章主要為大家詳細介紹了Java的分支結(jié)構(gòu)與循環(huán),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Spring整合MyBatis的三種方式

    Spring整合MyBatis的三種方式

    這篇文章主要介紹了Spring整合MyBatis的三種方式,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 從零開始學(xué)java之二叉樹和哈希表實現(xiàn)代碼

    從零開始學(xué)java之二叉樹和哈希表實現(xiàn)代碼

    這篇文章主要介紹了java之二叉樹和哈希表實現(xiàn)的相關(guān)資料,二叉查找樹和平衡二叉樹是二叉樹的兩種特殊形式,哈希表是一種通過哈希函數(shù)將數(shù)據(jù)與哈希值關(guān)聯(lián)起來的數(shù)據(jù)結(jié)構(gòu),可以快速查找數(shù)據(jù),文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • java 中HashMap、HashSet、TreeMap、TreeSet判斷元素相同的幾種方法比較

    java 中HashMap、HashSet、TreeMap、TreeSet判斷元素相同的幾種方法比較

    這篇文章主要介紹了從源碼的角度淺析HashMap、TreeMap元素的存儲和獲取元素的邏輯;從Map與Set之間的關(guān)系淺析常用的Set中元素的存儲和判斷是否重復(fù)的邏輯,需要的朋友可以參考下
    2017-01-01
  • 提升性能秘密武器Java Unsafe類面試精講

    提升性能秘密武器Java Unsafe類面試精講

    這篇文章主要為大家介紹了提升性能秘密武器Java Unsafe類面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • idea推送項目到gitee中的創(chuàng)建方法

    idea推送項目到gitee中的創(chuàng)建方法

    這篇文章主要介紹了idea推送項目到gitee中的創(chuàng)建方法,本文通過圖文實例相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08

最新評論

无极县| 宣汉县| 耒阳市| 娄烦县| 筠连县| 安丘市| 淅川县| 峡江县| 祁阳县| 莆田市| 靖安县| 莫力| 漳浦县| 玉门市| 阳高县| 措美县| 北宁市| 梁山县| 巨野县| 禄丰县| 柳河县| 长沙市| 辛集市| 枣庄市| 岳普湖县| 保山市| 浦东新区| 蒙阴县| 东莞市| 儋州市| 新津县| 淳化县| 江川县| 清新县| 公安县| 郎溪县| 兴宁市| 寿光市| 垣曲县| 石泉县| 水富县|