2009-02-23 11 views
7

Voglio creare un oggetto Java File in memoria (senza creare un file fisico) e popolare il suo contenuto con una matrice di byte.Creare un oggetto File Java (o equivalente) utilizzando una matrice di byte in memoria (senza un file fisico)

Questo può essere fatto?

L'idea è di passare a una primavera InputStreamSource. Sto cercando il metodo qui sotto, ma ritorna dicendo "l'array di byte non contiene un nome di file".

MimeMessage message = mailSender.createMimeMessage(); 
MimeMessageHelper helper = new MimeMessageHelper(message);  
helper.setFrom("[email protected]", "xyz"); 
helper.setTo(email); 
helper.setText(body,true); 
helper.setSubject(subject); 
helper.addInline("cImage", 
     new InputStreamResource(new ByteArrayInputStream(imageByteArr))); 

mailSender.send(message); 

risposta

7

È possibile incollare l'intera traccia dello stack? Non esiste un file "in memoria". L'utilizzo di ByteArrayInputStream dovrebbe essere sufficiente.


È necessario implementare Resource # getFilename(). Prova il seguente:

helper.addInline("cImage", new ByteArrayResource(imageByteArr){ 
      @Override 
      public String getFilename() { 
       return fileName; 
      } 
     }); 
+0

java.lang.IllegalStateException: la risorsa caricata dall'array di byte non contiene un nome file in org.springframework.core.io.AbstractResource.getFilename (AbstractResource.java:148) in org.springframework .mail.javamail.MimeMessageHelper.addInline (MimeMessageHelper.java:922) –

+0

Grazie Kevin, ha funzionato !! Soluzione fantastica –

+0

Si può sperare di vederlo presto in azione su www.creately.com :) (Siamo in atm beta privata) –

4

Forse è necessario utilizzare il other constructor of InputStreamResource?

+0

No. Ottengo - java.lang.IllegalStateException: abc.png non ha un nome file su org.springframework.core.io.AbstractResource.getFilename (AbstractResource.java:148) su org.springframework.mail.javamail.MimeMessageHelper. addInline (MimeMessageHelper.java:922) –

0

Hai provato a cambiare la risorsa che hai inserito in addInline()? Se si desidera che la risorsa sia in memoria, avrei provato un org.springframework.core.io.ByteArrayResource.

Aggiornamento: Penso che potrebbe essere necessario utilizzare la versione DataSource del metodo addInline() e quindi utilizzare un oggetto origine dati associato a un array di byte per alimentare i dati nella classe helper. Vorrei provare la seguente:

MimeMessage message = mailSender.createMimeMessage(); 
MimeMessageHelper helper = new MimeMessageHelper(message);    
helper.setFrom("[email protected]", "xyz"); 
helper.setTo(email); 
helper.setText(body,true); 
helper.setSubject(subject); 

// use javax.mail.util.ByteArrayDataSource 
ByteArrayDataSource imgDS = new ByteArrayDataSource(imageByteArr, "image/png"); 
helper.addInline("cImage", imgDS); 

mailSender.send(message); 
+0

Provato. Stessa eccezione: ( Quello che ottengo è una matrice grezza di dati bitmap. Sembra che ho bisogno di metterlo in un file prima di qualcosa? –

+0

Potrebbe essere necessario utilizzare la versione di addInLine() che accetta un DataSource come secondo parametro. C'è un javax.util.mail.ByteArrayDataSource che implementa la funzionalità di avvolgere un array di byte senza un file fisico. – dhable

0

Forse vale la pena di provare un diverso overload del metodo:

addInline(String contentId, 
      InputStreamSource inputStreamSource, 
      String contentType) 

Ie:

addInline("cImage", 
      new InputStreamSource() 
      { 
      final private InputStream src = 
            new ByteArrayInputStream(imageByteArr); 
      public InputStream getInputStream() {return src;} 
      }, 
      "image/jpeg"); // or whatever image type you use 
0

E 'importante creare l'oggetto MimeMessageHelper correttamente supporto allegati e risorse in linea.

Esempio: helper MimeMessageHelper = new MimeMessageHelper (message, true, "UTF-8");

In questo esempio poiché multipart è impostato su true MULTIPART_MODE_MIXED_RELATED verrà utilizzato e gli allegati e le risorse in linea saranno supportati.

Problemi correlati