«1. Обзор

В этом кратком руководстве мы рассмотрим различные способы преобразования Spring MultipartFile в файл.

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

Метод getBytes() полезен в тех случаях, когда мы хотим выполнить дополнительные операции над файлом перед записью на диск, например, вычислить хэш файла.

3. MultipartFile#getInputStream

Далее давайте рассмотрим метод getInputStream() MultipartFile:

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[]. Затем мы создаем File и OutputStream для записи содержимого буфера.

Подход getInputStream() полезен в тех случаях, когда нам нужно обернуть InputStream в другой InputStream, скажем, например, в GZipInputStream, если загруженный файл был заархивирован.

4. MultipartFile#transferTo

Наконец, давайте посмотрим на метод transferTo() MultipartFile:

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 нужно только записать в файл.

5. Заключение

В этом руководстве мы рассмотрели способы преобразования Spring MultipartFile в файл.

Как обычно, все примеры кода можно найти на GitHub.