web-dev-qa-db-fra.com

Comment convertir un tableau d'octets en MultipartFile

Je reçois une image sous la forme d'une chaîne codée BASE64 (encodedBytes) et utilise l'approche suivante pour le décoder en octet [] côté serveur.

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

Maintenant, je veux le convertir en MultipartFile en utilisant cet octet obtenu ci-dessus?

Existe-t-il un moyen de convertir byte [] en org.springframework.web.multipart.MultipartFile ??

11
Shoaib Chikate

org.springframework.web.multipart.MultipartFile est une interface, donc vous devez d'abord travailler avec une implémentation de cette interface.

La seule implémentation que je peux voir pour cette interface que vous pouvez utiliser immédiatement est org.springframework.web.multipart.commons.CommonsMultipartFile. L'API pour cette implémentation peut être trouvé ici

Sinon, comme org.springframework.web.multipart.MultipartFile est une interface, vous pouvez fournir votre propre implémentation et simplement envelopper votre tableau d'octets. À titre d'exemple trivial:

/*
*<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);
        }
    }
21
Rob Blake

Cette réponse a déjà été répondue ci-dessus. Récemment, je travaillais sur l'exigence de convertir un objet tableau d'octets en un objet multipartfile. Il y a deux façons d'y parvenir. 

Approche 1:

Utilisez le fichier CommonsMultipartFile par défaut où vous utilisez l'objet FileDiskItem pour le créer. Exemple:

Approach 1:

Utilisez le fichier CommonsMultipartFile par défaut où vous utilisez l'objet FileDiskItem pour le créer. Exemple:

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

Approche 2:

Créez votre propre objet fichier multipart personnalisé et convertissez le tableau d'octets en fichier multipart.

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

Voici comment vous pouvez utiliser l'objet CustomMultipartFile ci-dessus.

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

Ceci créera le PDF requis et le stockera dans 

Java.io.tmpdir Avec le nom intermediate.pdf

Merci.

1
Nayan