2009-02-23 4 views
7

Je veux créer un objet Java File en mémoire (sans créer un fichier physique) et remplir son contenu avec un tableau d'octets.Créer un objet Java de fichier (ou équivalent) à l'aide d'un tableau d'octets dans la mémoire (sans un fichier physique)

Est-ce que cela peut être fait?

L'idée est de passer à un ressort InputStreamSource. J'essaye la méthode ci-dessous, mais il revient en disant "le tableau d'octets ne contient pas un nom de fichier.".

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

Répondre

7

Pouvez-vous coller la trace complète de la pile? Il n'y a pas de fichier "en mémoire". L'utilisation d'un ByteArrayInputStream devrait être suffisante.


Vous devez mettre en œuvre des ressources # getFilename(). Effectuez les opérations suivantes:

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

java.lang.IllegalStateException: ressource chargée à partir du tableau d'octets ne porte pas de nom de fichier à org.springframework.core.io.AbstractResource.getFilename (AbstractResource.java:148) à org.springframework .mail.javamail.MimeMessageHelper.addInline (MimeMessageHelper.java:922) –

+0

Merci Kevin, il a travaillé !! Solution fantastique. –

+0

Vous pouvez le voir bientôt en action à www.creately.com :) (Nous sommes en beta privé atm.) –

4

Peut-être que vous devez utiliser le other constructor of InputStreamResource?

+0

Non. Je reçois - java.lang.IllegalStateException: abc.png ne porte pas un nom de fichier à org.springframework.core.io.AbstractResource.getFilename (AbstractResource.java:148) à org.springframework.mail.javamail.MimeMessageHelper. addInline (MimeMessageHelper.java:922) –

0

Avez-vous essayé de changer la ressource que vous nourrissez à addInline()? Si vous vouliez que la ressource soit en mémoire, j'aurais essayé un org.springframework.core.io.ByteArrayResource.

Mise à jour: Je pense que vous pourriez avoir besoin d'utiliser la version DataSource de la méthode addInline(), puis utiliser un tableau d'octets lié objet source de données pour alimenter les données dans la classe d'aide. Je les opérations suivantes:

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

Essayé. exception même :( Ce que je reçois est un tableau brut de données bitmap. On dirait que je dois le mettre dans un fichier avant quoi que ce soit? –

+0

Vous devrez peut-être utiliser la version de addInLine() qui accepte un DataSource comme second paramètre. Il existe un fichier javax.util.mail.ByteArrayDataSource qui implémente la fonctionnalité d'encapsulation d'un tableau d'octets sans fichier physique. – dhable

0

Peut-être la peine d'essayer une surcharge différente de la méthode:

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

Il est important de créer l'objet MimeMessageHelper correctement soutenir les pièces jointes et les ressources en ligne.

Exemple: aide MimeMessageHelper = new MimeMessageHelper (message, vrai, "UTF-8");

Dans cet exemple, étant donné que multipart est défini sur true, MULTIPART_MODE_MIXED_RELATED sera utilisé et les pièces jointes et les ressources en ligne seront prises en charge.

Questions connexes