1. 概述

本文我们将学习将 Spring MultipartFile 转为 File 几种方法。

2. 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");

这种方式适合我们需要在将文件写入磁盘之前执行其他操作,比如计算文件哈希、md5,那么getBytes()方法非常有用。

3. MultipartFile#getInputStream 方法

使用 MultipartFile 的 getInputStream() 方法实现:

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读取字节,并将它们存储在buffer中。然后,我们创建一个File和OutputStream来写入buffer内容。

这种使用getInputStream()方法的方式在某些情况下非常有用,比如需要将InputStream包装成另一个InputStream,例如如果上传的文件是gzip压缩格式,则可以使用GZipInputStream。

4. MultipartFile#transferTo 方法

最后一种,使用MultipartFile的transferTo()方法:

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()方法,我们只需要创建要写入File对象,然后将该File传递给 transferTo() 方法即可。

可见当我们只需要写入文件不执行其他操作时,这种方式最简单直接。

5. 总结

本文我们学习了几种将Spring MultipartFile 转为 File的方法,各有优势和使用场景。源码放在 GitHub