«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.