2009-02-23 12 views
7

Quiero crear un objeto Java File en la memoria (sin crear un archivo físico) y llenar su contenido con una matriz de bytes.Crear un objeto de archivo Java (o equivalente) utilizando una matriz de bytes en memoria (sin un archivo físico)

se puede hacer esto?

La idea es pasarlo a un resorte InputStreamSource. Estoy probando el método a continuación, pero vuelve diciendo "la matriz de bytes no contiene un nombre de archivo".

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

Respuesta

7

¿Se puede pegar el trazado completo de la pila? No existe un archivo "en memoria". Usar un ByteArrayInputStream debería ser suficiente.


Necesita implementar Resource # getFilename(). Intente lo siguiente:

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

java.lang.IllegalStateException: el recurso cargado desde la matriz de bytes no lleva el nombre de archivo en org.springframework.core.io.AbstractResource.getFilename (AbstractResource.java:148) en org.springframework .mail.javamail.MimeMessageHelper.addInline (MimeMessageHelper.java:922) –

+0

Gracias Kevin, funcionó !! Fantástica solución. –

+0

Esperemos que lo veas en acción pronto en www.creately.com :) (Estamos en una atm privada de beta). –

4

Quizás necesite usar el other constructor of InputStreamResource?

+0

No. Obtengo - java.lang.IllegalStateException: abc.png no tiene un nombre de archivo en org.springframework.core.io.AbstractResource.getFilename (AbstractResource.java:148) en org.springframework.mail.javamail.MimeMessageHelper. addInline (MimeMessageHelper.java:922) –

0

¿Ha intentado cambiar el recurso que alimenta a addInline()? Si quisiera que el recurso estuviera en memoria, habría intentado un org.springframework.core.io.ByteArrayResource.

Actualización: Creo que puede necesitar utilizar la versión de DataSource del método addInline() y luego usar un objeto de origen de datos enlazado de matriz de bytes para alimentar los datos en la clase auxiliar. Me gustaría probar el siguiente:

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

Lo intenté. La misma excepción :( Lo que obtengo es una matriz en bruto de datos de mapa de bits. Parece que necesito ponerlo en un archivo antes que nada? –

+0

Es posible que necesite usar la versión de addInLine() que acepta un DataSource como su segundo parámetro. Hay un javax.util.mail.ByteArrayDataSource que implementa la funcionalidad de envolver una matriz de bytes sin un archivo físico. – dhable

0

Tal vez sea vale la pena probar una sobrecarga diferente del método:

addInline(String contentId, 
      InputStreamSource inputStreamSource, 
      String contentType) 

Es decir:

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

Es importante crear el objeto MimeMessageHelper correctamente soporte adjuntos y recursos en línea.

Ejemplo: MimeMessageHelper helper = new MimeMessageHelper (mensaje, verdadero, "UTF-8");

En este ejemplo, dado que multipart se establece en verdadero, se usará MULTIPART_MODE_MIXED_RELATED y se admitirán los archivos adjuntos y los recursos en línea.

Cuestiones relacionadas