在 Java 中將 byte[] 轉換為 MultipartFile
一、概述
在本教程中,我們將了解如何將byte array
轉換為[MultipartFile](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/multipart/MultipartFile.html)
。
MutlipartFile
是 Spring 提供的接口,用於接收多個請求塊中的文件,因此我們需要一些實現來實例化一個MultipartFile
對象。 Spring 不為代碼提供任何默認實現,但它確實提供了一個用於測試目的。
2. 實現MultipartFile
接口
讓我們為MultipartFile
接口創建我們自己的實現並包裝輸入byte array
:
public class CustomMultipartFile implements MultipartFile {
private byte[] input;
@Override
public String getName() {
return null;
}
@Override
public String getOriginalFilename() {
return null;
}
@Override
public String getContentType() {
return null;
}
//We've defined the rest of the interface methods in the next snippet
}
我們在我們的類中定義了一個byte array
屬性,以便我們可以捕獲輸入的值。此外,我們已經覆蓋了上面接口中的方法,這取決於實現細節。因此,有關文件名或內容類型的詳細信息可以作為自定義邏輯提供。結果,我們在這裡返回了null
。
我們還為接口中的其他所需方法提供了我們自己的實現:
public class CustomMultipartFile implements MultipartFile {
//previous methods
@Override
public boolean isEmpty() {
return input == null || input.length == 0;
}
@Override
public long getSize() {
return input.length;
}
@Override
public byte[] getBytes() throws IOException {
return input;
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(input);
}
@Override
public void transferTo(File destination) throws IOException, IllegalStateException {
try(FileOutputStream fos = new FileOutputStream(destination)) {
fos.write(input);
}
}
}
這些方法可能不需要任何自定義邏輯,因此我們在類中定義了它們。有幾種不同的方式來實現transferTo(File destination)
方法。讓我們看看下面的幾個:
我們可以使用 Java NIO:
@Override
public void transferTo(File destination) throws IOException, IllegalStateException {
Path path = Paths.get(destination.getPath());
Files.write(path, input);
}
另一種選擇是將Apache commons IO 依賴項添加到我們的 POM 並使用FileUtils
類:
@Override
public void transferTo(File destination) throws IOException, IllegalStateException {
FileUtils.writeByteArrayToFile(destination, input);
}
**transferTo(File destination)
方法在MultipartFile
只需要寫入File,
**並且有多種方法可以將MultipartFile
寫入File
.
現在我們已經定義了我們的類,讓我們用一個小的測試用例來測試這個實現:
@Test
void whenProvidingByteArray_thenMultipartFileCreated() throws IOException {
byte[] inputArray = "Test String".getBytes();
CustomMultipartFile customMultipartFile = new CustomMultipartFile(inputArray);
Assertions.assertFalse(customMultipartFile.isEmpty());
Assertions.assertArrayEquals(inputArray, customMultipartFile.getBytes());
Assertions.assertEquals(inputArray.length,customMultipartFile.getSize());
}
在上面的測試用例中,我們已經成功地將字節數組轉換為 MultipartFile 實例。
3.模擬多部分文件
Spring 提供開箱即用的[MockMultipartFile](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/mock/web/MockMultipartFile.html)
用於測試目的以訪問 Multipart 請求。
讓我們創建一個測試看看它是如何工作的:
@Test
void whenProvidingByteArray_thenMockMultipartFileCreated() throws IOException {
byte[] inputArray = "Test String".getBytes();
MockMultipartFile mockMultipartFile = new MockMultipartFile("tempFileName",inputArray);
Assertions.assertFalse(mockMultipartFile.isEmpty());
Assertions.assertArrayEquals(inputArray, mockMultipartFile.getBytes());
Assertions.assertEquals(inputArray.length,mockMultipartFile.getSize());
}
我們已經成功地使用 Spring 提供的MockMultipartFile
對象將byte array
轉換為MultipartFile
對象。
4。結論
在本教程中,我們介紹瞭如何將byte array
轉換為MultipartFile
對象。
與往常一樣,所有代碼示例都可以在 GitHub 上找到。