web-dev-qa-db-ja.com

バイト配列をMultipartFileに変換する方法

BASE64エンコードされたString(encodedBytes)の形式で画像を受信し、次のアプローチを使用してサーバー側でbyte []に​​デコードします。

BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = decoder.decodeBuffer(encodedBytes);

ここで、上記で取得したこのバイトを使用してMultipartFileに変換したいですか?

Byte []をorg.springframework.web.multipart.MultipartFileに変換する方法はありますか?

20
Shoaib Chikate

org.springframework.web.multipart.MultipartFileはインターフェースであるため、最初にこのインターフェースの実装で作業する必要があります。

そのまま使用できるそのインターフェースについて私が見ることができる唯一の実装はorg.springframework.web.multipart.commons.CommonsMultipartFile。その実装のAPIは次の場所にあります here

または、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);
        }
    }
24
Rob Blake

この回答はすでに上記で回答済みです。最近、バイト配列オブジェクトをmultipartfileオブジェクトに変換する要件に取り組んでいました。これを実現するには2つの方法があります。

アプローチ1:

FileDiskItemオブジェクトを使用して作成するデフォルトのCommonsMultipartFileを使用します。例:

Approach 1:

FileDiskItemオブジェクトを使用して作成するデフォルトのCommonsMultipartFileを使用します。例:

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:

独自のカスタムマルチパートファイルオブジェクトを作成し、バイト配列をマルチパートファイルに変換します。

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=が作成され、それが

Intermediate.pdfという名前のJava.io.tmpdir

ありがとう。

1
Nayan