在Java中将byte[]转换为MultipartFile

2023/05/19

一、概述

在本教程中,我们将了解如何将字节数组转换为MultipartFile

MutlipartFile是 Spring 提供的接口,用于接收多个请求块中的文件,因此我们需要一些实现来实例化一个MultipartFile对象。Spring 不为代码提供任何默认实现,但它确实提供了一个用于测试目的。

2. 实现MultipartFile接口

让我们为MultipartFile接口创建我们自己的实现并包装输入字节数组:

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
}

我们在我们的类中定义了一个字节数组属性,以便我们可以捕获输入的值。此外,我们已经覆盖了上面接口中的方法,这取决于实现细节。因此,有关文件名或内容类型的详细信息可以作为自定义逻辑提供。结果,我们在这里返回了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用于测试目的以访问 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对象将字节数组转换为MultipartFile对象。

4。结论

在本教程中,我们介绍了如何将字节数组转换为MultipartFile对象。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章