知識庫 / Java IO RSS 訂閱

將 Spring MultipartFile 轉換為 File

Java IO,Spring Web
HongKong
6
12:53 PM · Dec 06 ,2025

1. 概述

本快速教程將介紹多種將 SpringMultipartFile 對象轉換為 File 對象,以及反向轉換的方法。

2. 將 MultipartFile 轉換為 File

MultipartFile 類提供了諸如 getBytes()getInputStream()transferTo() 等方法,用於將 MultipartFile 轉換為 File

2.1. 使用 MultipartFile#getBytes

MultipartFile 具有 getBytes() 方法,該方法返回文件內容的字節數組。我們可以使用此方法將字節寫入文件:

MultipartFile multipartFile = new MockMultipartFile("sourceFile.tmp", "Hello World".getBytes());

File file = new File("src/main/resources/targetFile.tmp");

try (OutputStream os = new FileOutputStream(file)) {
    os.write(multipartFile.getBytes());
}

assertThat(FileUtils.readFileToString(new File("src/main/resources/targetFile.tmp"), "UTF-8"))
  .isEqualTo("Hello World");

getBytes() 方法在需要對文件在寫入磁盤之前執行額外操作的實例中非常有用,例如計算文件哈希值。

2.2. 使用 MultipartFile#getInputStream

接下來,讓我們看看 MultipartFilegetInputStream() 方法:

MultipartFile multipartFile = new MockMultipartFile("sourceFile.tmp", "Hello World".getBytes());

InputStream initialStream = multipartFile.getInputStream();
byte[] buffer = new byte[initialStream.available()];
initialStream.read(buffer);

File targetFile = new File("src/main/resources/targetFile.tmp");

try (OutputStream outStream = new FileOutputStream(targetFile)) {
    outStream.write(buffer);
}

assertThat(FileUtils.readFileToString(new File("src/main/resources/targetFile.tmp"), "UTF-8"))
  .isEqualTo("Hello World");

我們在這裏使用 getInputStream() 方法獲取 InputStream,讀取 InputStream 中的字節,並將它們存儲在 byte[] buffer 中。然後,我們創建一個 FileOutputStream 來寫入 buffer 的內容。

使用 getInputStream() 的方法在我們需要將 InputStream 包裝成另一個 InputStream 的情況下非常有用,例如,如果上傳的文件被 gzip 壓縮,則使用 GZipInputStream

2.3. 使用 MultipartFile#transferTo 方法

最後,讓我們來看看 MultipartFiletransferTo() 方法:

MultipartFile multipartFile = new MockMultipartFile("sourceFile.tmp", "Hello World".getBytes());

File file = new File("src/main/resources/targetFile.tmp");

multipartFile.transferTo(file);

assertThat(FileUtils.readFileToString(new File("src/main/resources/targetFile.tmp"), "UTF-8"))
  .isEqualTo("Hello World");

使用 transferTo() 方法,我們只需要創建要寫入字節的文件,然後將該文件傳遞給 transferTo() 方法。

transferTo() 方法在 MultipartFile 只需要寫入到 File 時非常有用。

3. 將 File 對象轉換為 MultipartFile 對象

我們可以使用 MockMultipartFile 類和 Apache Commons 庫將 File 對象轉換為 MultipartFile 對象。

3.1. 使用 MockMultipartFile

Spring 框架提供了 MockMultipartFile 類,用於在 File 對象和 MultipartFile 對象之間進行轉換。但是,該類僅 intended to be used only in test scopes

以下是一個使用 MockMultipartFileFile 對象轉換為 MultipartFile 對象的示例代碼:

@Test
void givenFile_whenCreateMultipartFile_thenContentMatch() throws IOException {
    File file = new File("src/main/resources/targetFile.tmp");
    byte[] fileBytes = Files.readAllBytes(file.toPath());
    MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", fileBytes);
    String fileContent = new String(multipartFile.getBytes());
    assertEquals("Hello World", fileContent);
    assertEquals("targetFile.tmp", multipartFile.getOriginalFilename());
}

在上述代碼中,我們創建了一個 File 對象並將其傳遞給 MockMultipartFile 實例。 MockMultipartFile 接受文件名、文件類型和文件字節作為參數。

最後,我們斷言 MultipartFile 的內容與預期內容相等。

值得注意的是,此方法最適用於測試代碼,不應在生產環境中進行使用

3.2. 使用 Apache Common 庫 (Spring Boot 2)

請注意,Apache Common 庫不再受 Spring Boot 3 支持。

如果您使用的是 Spring Boot 2,則可以使用 Apache Commons IO 和 Apache Commons FileUpload 庫,這些庫提供 API,用於將 File 轉換為 MultipartFile

首先,讓我們在 pom.xml 中添加 Apache Commons IOApache Commons FileUpload 依賴項:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.15.1</version>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.5</version>
</dependency>

接下來,我們來看一個使用這兩個庫將 File轉換為MultipartFile的示例代碼:

@Test
void givenFile_whenCreateMultipartFileUsingCommonsMultipart_thenContentMatch() throws IOException {
    File file = new File("src/main/resources/targetFile.tmp");
    FileItem fileItem = new DiskFileItem("file", Files.probeContentType(file.toPath()), 
      false, file.getName(), (int) file.length(), file.getParentFile());
    InputStream input = new FileInputStream(file);
    OutputStream outputStream = fileItem.getOutputStream();
    IOUtils.copy(input, outputStream);
    MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
    String fileContent = new String(multipartFile.getBytes());
    assertEquals("Hello World", fileContent);
    assertEquals("targetFile.tmp", multipartFile.getOriginalFilename());
}

首先,我們創建了一個 File 對象並將一些其方法傳遞給 DiskFileItem 對象。 接下來,我們創建了一個 FileInputStream 實例,該實例接受 File 對象作為參數。

此外,我們調用了 DiskFileItem 對象的 getOutputStream() 方法,並使用 Apache Commons IO 庫中的 copy() 方法將從 InputStream 複製到 OutputStreamcopy() 方法將文件內容保存到 DiskFileItem 對象中。

最後,我們創建了 CommonsMultipartFile 對象,該對象接受 DiskFileItem 對象,從而完成 FileMultipartFile 的轉換。

值得注意的是,這是一種在生產應用程序中將 File 轉換為 MultipartFile 的最佳方法。

4. 結論

在本文中,我們探討了在 Spring 中將 MultipartFileFile 之間進行轉換的方法。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.