Создайте объект Java File (или эквивалентный), используя байтовый массив в памяти (без физического файла) - PullRequest
7 голосов
/ 23 февраля 2009

Я хочу создать объект Java File в памяти (без создания физического файла) и заполнить его содержимое байтовым массивом.

Можно ли это сделать?

Идея состоит в том, чтобы передать его пружине InputStreamSource. Я пытаюсь метод ниже, но он возвращает, говоря «массив байтов не содержит имя файла».

MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message);      
helper.setFrom("no-reply@example.com", "xyz");
helper.setTo(email);
helper.setText(body,true);
helper.setSubject(subject);
helper.addInline("cImage",
        new InputStreamResource(new ByteArrayInputStream(imageByteArr)));

mailSender.send(message);

Ответы [ 5 ]

7 голосов
/ 23 февраля 2009

Можете ли вы вставить полную трассировку стека? Не существует такой вещи, как файл «в памяти». Использование ByteArrayInputStream должно быть достаточно.


Вам необходимо реализовать Resource # getFilename (). Попробуйте следующее:

helper.addInline("cImage", new ByteArrayResource(imageByteArr){
            @Override
            public String getFilename() {
                return fileName;
            }
        });
4 голосов
/ 23 февраля 2009

Может быть, вам нужно использовать другой конструктор InputStreamResource ?

0 голосов
/ 15 мая 2009

Важно правильно создать объект MimeMessageHelper для поддержки вложений и встроенных ресурсов.

Пример: MimeMessageHelper helper = new MimeMessageHelper (сообщение, истина, "UTF-8");

В этом примере, поскольку для multipart установлено значение true, будет использоваться MULTIPART_MODE_MIXED_RELATED, а вложения и встроенные ресурсы будут поддерживаться.

0 голосов
/ 23 февраля 2009

Возможно, стоит попробовать другую перегрузку метода:

addInline(String contentId, 
          InputStreamSource inputStreamSource, 
          String contentType) 

т.е:.

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 голосов
/ 23 февраля 2009

Вы пытались изменить ресурс, которым вы кормите, на addInline ()? Если бы вы хотели, чтобы ресурс находился в памяти, я бы попробовал org.springframework.core.io.ByteArrayResource.

Обновление: Я думаю, что вам может понадобиться использовать версию DataSource метода addInline (), а затем использовать объект источника данных, связанный с байтовым массивом, для подачи данных в вспомогательный класс. Я бы попробовал следующее:

MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message);              
helper.setFrom("no-reply@example.com", "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);
...