2013-08-22 8 views
9

Ich erhalte Bild in Form von BASE64-codierten String (codedBytes) und verwenden Sie folgende Vorgehensweise zum Decodieren in Byte [] auf der Serverseite.Wie konvertiert man Byte-Array zu MultipartFile

Jetzt möchte ich es in MultipartFile konvertieren mit diesem Byte erhalten oben?

Gibt es eine Möglichkeit, byte [] in org.springframework.web.multipart.MultipartFile ??

Antwort

15

org.springframework.web.multipart.MultipartFile ist eine Schnittstelle, also müssen Sie zuerst mit einer Implementierung dieser Schnittstelle arbeiten.

Die einzige Implementierung, die ich für diese Schnittstelle sehen kann, die Sie out-of-the-box verwenden können, ist org.springframework.web.multipart.commons.CommonsMultipartFile. Die API für diese Implementierung kann here

Alternativ als org.springframework.web.multipart.MultipartFile ist eine Schnittstelle, können Sie Ihre eigene Implementierung bereitstellen und einfach Ihre Byte-Array umbrechen. Ein triviales Beispiel:

/* 
*<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); 
     } 
    } 
+1

Das ist cool. Dank bro. –

+1

Sehr gute Lösung von Ihnen gegeben.Hoffe diese Frage und Antwort wird für viele Leute nützlich sein –

+0

In 'transferTo', sollte der FileOutputStream nach dem Schreiben geschlossen werden? – Ascalonian

0

Diese Antwort wurde bereits oben beantwortet. Kürzlich arbeitete ich an der Anforderung, Byte-Array-Objekt zu Multipartfile-Objekt zu konvertieren. Es gibt zwei Möglichkeiten, dies zu erreichen.

Ansatz 1:

Verwenden Sie den Standard CommonsMultipartFile, wo Sie die FileDiskItem Objekt zu verwenden, um es zu schaffen. Beispiel:

Approach 1: 

Verwenden Sie den Standard CommonsMultipartFile, wo Sie die FileDiskItem Objekt zu verwenden, um es zu schaffen. Beispiel:

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

Ansatz 2:

Erstellen Sie Ihr eigenes Multipart-Datei-Objekt und konvertiert der Byte-Array 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); 
} 
} 

So können Sie das obige CustomMultipartFile-Objekt verwenden.

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

Dadurch werden die erforderlichen PDF erstellen und speichern in

java.io.tmpdir mit dem Namen intermediate.pdf

Dank.