2009-02-23 32 views
7

Tôi muốn tạo đối tượng Java File trong bộ nhớ (không tạo tệp vật lý) và điền nội dung của nó bằng mảng byte.Tạo đối tượng Tệp Java (hoặc tương đương) sử dụng mảng byte trong bộ nhớ (không có tệp vật lý)

Việc này có thể thực hiện được không?

Ý tưởng là chuyển nó tới Spring InputStreamSource. Tôi đang thử phương pháp dưới đây, nhưng nó trả về nói rằng "mảng byte không chứa một tên tập tin.".

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

Trả lời

7

Bạn có thể dán dấu vết ngăn xếp đầy đủ không? Không có những thứ như một tập tin "trong bộ nhớ". Sử dụng ByteArrayInputStream là đủ.


Bạn cần triển khai Resource # getFilename(). Hãy thử các cách sau:

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

java.lang.IllegalStateException: tài nguyên được nạp từ mảng byte không mang tên tệp tại org.springframework.core.io.AbstractResource.getFilename (AbstractResource.java:148) tại org.springframework .mail.javamail.MimeMessageHelper.addInline (MimeMessageHelper.java:922) –

+0

Cảm ơn Kevin, nó đã hoạt động !! Giải pháp tuyệt vời. –

+0

Bạn hy vọng có thể thấy nó hoạt động sớm tại www.creately.com :) (Chúng tôi đang ở phiên bản beta riêng). –

4

Có thể bạn cần sử dụng other constructor of InputStreamResource?

+0

Không. Tôi nhận được - java.lang.IllegalStateException: abc.png không mang tên tệp tại org.springframework.core.io.AbstractResource.getFilename (AbstractResource.java:148) tại org.springframework.mail.javamail.MimeMessageHelper. addInline (MimeMessageHelper.java:922) –

0

Bạn đã thử thay đổi tài nguyên bạn nạp vào addInline() chưa? Nếu bạn muốn tài nguyên có trong bộ nhớ, tôi đã thử một org.springframework.core.io.ByteArrayResource.

Cập nhật: Tôi nghĩ bạn có thể cần sử dụng phiên bản DataSource của phương thức addInline() và sau đó sử dụng đối tượng nguồn dữ liệu bị ràng buộc mảng byte để nạp dữ liệu vào lớp trợ giúp. Tôi sẽ thử như sau:

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

Đã thử. Ngoại lệ tương tự: ( Điều tôi nhận được là một mảng dữ liệu bitmap thô. Có vẻ như tôi cần đặt nó vào một tệp trước bất kỳ thứ gì? –

+0

Bạn có thể cần sử dụng phiên bản addInLine() chấp nhận một DataSource làm thông số thứ hai của bạn. Có một javax.util.mail.ByteArrayDataSource thực hiện chức năng của việc bao bọc một mảng byte mà không cần tệp vật lý. – dhable

0

Có lẽ giá trị của nó cố gắng một tình trạng quá tải khác nhau của phương pháp này:

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

Điều quan trọng là để tạo ra các đối tượng MimeMessageHelper một cách chính xác để hỗ trợ tệp đính kèm và tài nguyên nội tuyến.

Ví dụ: MimeMessageHelper helper = new MimeMessageHelper (thông báo, đúng, "UTF-8");

Trong ví dụ này vì đa phần được đặt thành true MULTIPART_MODE_MIXED_RELATED sẽ được sử dụng và các tệp đính kèm và nội dung sẽ được hỗ trợ.

Các vấn đề liên quan