2009-02-23 10 views
7

Chcę utworzyć obiekt Java File w pamięci (bez tworzenia pliku fizycznego) i zapełnić jego zawartość tablicą bajtów.Utwórz obiekt Java (lub jego odpowiednik), używając tablicy bajtów w pamięci (bez fizycznego pliku).

Czy to można zrobić?

Ideą jest przekazanie go na wiosnę InputStreamSource. Próbuję tej metody poniżej, ale zwraca komunikat "tablica bajtów nie zawiera nazwy pliku.".

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

Odpowiedz

7

Czy można wkleić cały ślad stosu? Nie ma czegoś takiego jak plik "w pamięci". Użycie obiektu ByteArrayInputStream powinno wystarczyć.


Musisz zaimplementować Resource # getFilename(). Wypróbuj następujące:

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

java.lang.IllegalStateException: zasoby załadowane z tablicy bajtów nie mają nazwy pliku at org.springframework.core.io.AbstractResource.getFilename (AbstractResource.java:148) at org.springframework .mail.javamail.MimeMessageHelper.addInline (MimeMessageHelper.java:922) –

+0

Dzięki Kevin, zadziałało !! Fantastyczne rozwiązanie. –

+0

Możesz mieć nadzieję, że wkrótce pojawi się na stronie www.creately.com :) (Jesteśmy w prywatnej wersji beta atm.) –

4
+0

Nie. Otrzymuję - java.lang.IllegalStateException: abc.png nie nosi nazwy pliku na org.springframework.core.io.AbstractResource.getFilename (AbstractResource.java:148) na org.springframework.mail.javamail.MimeMessageHelper. addInline (MimeMessageHelper.java:922) –

0

Czy próbowałeś zmienić zasób wysuwany do addInline()? Jeśli chciałbyś, aby zasób był w pamięci, wypróbowałbym org.springframework.core.io.ByteArrayResource.

Aktualizacja: Myślę, że być może trzeba będzie użyć wersji DataSource metody addInline(), a następnie użyć obiektu źródła danych powiązanego z tablicą bajtową w celu podania danych do klasy pomocniczej. Chciałbym spróbować wykonać następujące czynności:

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

Próbowałem. Ten sam wyjątek: ( Dostaje się surową tablicę danych bitmapowych. Wygląda na to, że muszę coś włożyć do pliku przed czymkolwiek? –

+0

Może być konieczne użycie wersji addInLine(), która akceptuje DataSource jako drugi parametr. Istnieje javax.util.mail.ByteArrayDataSource, który implementuje funkcję owijania tablicy bajtów bez fizycznego pliku. – dhable

0

Może jego warto spróbować innego przeciążenie metody:

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

ważne jest, aby utworzyć obiekt MimeMessageHelper poprawnie obsługa załączników i zasobów wbudowanych.

Przykład: pomocnik MimeMessageHelper = nowy MimeMessageHelper (wiadomość, prawda, "UTF-8");

W tym przykładzie, ponieważ wieloczęściowy ma wartość true, zostanie użyty MULTIPART_MODE_MIXED_RELATED, a obsługiwane będą załączniki i inline resouces.

Powiązane problemy