Как преобразовать массив байтов в MultipartFile
Я получаю изображение в виде кодированной BASE64 String (encodedBytes) и использую следующий подход для декодирования в байте [] на стороне сервера.
BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = decoder.decodeBuffer(encodedBytes);
Теперь я хочу преобразовать его в MultipartFile, используя этот байт, полученный выше?
Есть ли способ конвертировать байт [] в org.springframework.web.multipart.MultipartFile??
Ответы
Ответ 1
org.springframework.web.multipart.MultipartFile
- это интерфейс, поэтому сначала вам нужно будет поработать с реализацией этого интерфейса.
Единственная реализация, которую я могу видеть для этого интерфейса, который вы можете использовать "из коробки", это org.springframework.web.multipart.commons.CommonsMultipartFile
. API для этой реализации можно найти здесь
В качестве альтернативы, поскольку org.springframework.web.multipart.MultipartFile
является интерфейсом, вы можете предоставить собственную реализацию и просто обернуть свой байтовый массив. В качестве тривиального примера:
/*
*<p>
* Trivial implementation of the {@link MultipartFile} interface to wrap a byte[] decoded
* from a BASE64 encoded String
*</p>
*/
public class BASE64DecodedMultipartFile implements MultipartFile {
private final byte[] imgContent;
public BASE64DecodedMultipartFile(byte[] imgContent) {
this.imgContent = imgContent;
}
@Override
public String getName() {
// TODO - implementation depends on your requirements
return null;
}
@Override
public String getOriginalFilename() {
// TODO - implementation depends on your requirements
return null;
}
@Override
public String getContentType() {
// TODO - implementation depends on your requirements
return null;
}
@Override
public boolean isEmpty() {
return imgContent == null || imgContent.length == 0;
}
@Override
public long getSize() {
return imgContent.length;
}
@Override
public byte[] getBytes() throws IOException {
return imgContent;
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(imgContent);
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
new FileOutputStream(dest).write(imgContent);
}
}
Ответ 2
Этот ответ уже ответил выше. Недавно я работал над требованием преобразовать объект массива байтов в объект multipartfile.
Есть два способа добиться этого.
Подход 1:
Используйте CommonsMultipartFile по умолчанию, где вы должны использовать объект FileDiskItem для его создания.
Пример:
Approach 1:
Используйте CommonsMultipartFile по умолчанию, где вы должны использовать объект FileDiskItem для его создания.
Пример:
FileItem fileItem = new DiskFileItem("fileData", "application/pdf",true, outputFile.getName(), 100000000, new java.io.File(System.getProperty("java.io.tmpdir")));
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
Подход 2:
Создайте свой собственный многостраничный файловый объект и преобразуйте массив байтов в multipartfile.
public class CustomMultipartFile implements MultipartFile {
private final byte[] fileContent;
private String fileName;
private String contentType;
private File file;
private String destPath = System.getProperty("java.io.tmpdir");
private FileOutputStream fileOutputStream;
public CustomMultipartFile(byte[] fileData, String name) {
this.fileContent = fileData;
this.fileName = name;
file = new File(destPath + fileName);
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
fileOutputStream = new FileOutputStream(dest);
fileOutputStream.write(fileContent);
}
public void clearOutStreams() throws IOException {
if (null != fileOutputStream) {
fileOutputStream.flush();
fileOutputStream.close();
file.deleteOnExit();
}
}
@Override
public byte[] getBytes() throws IOException {
return fileContent;
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(fileContent);
}
}
Это, как вы можете использовать выше объекта CustomMultipartFile.
String fileName = "intermediate.pdf";
CustomMultipartFile customMultipartFile = new CustomMultipartFile(bytea, fileName);
try {
customMultipartFile.transferTo(customMultipartFile.getFile());
} catch (IllegalStateException e) {
log.info("IllegalStateException : " + e);
} catch (IOException e) {
log.info("IOException : " + e);
}
Это создаст необходимый PDF файл и сохранит его в
java.io.tmpdir с именем intermediate.pdf
Спасибо.