Создайте объект Java File (или эквивалент), используя массив байтов в памяти (без физического файла)

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

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

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

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

Ответов (5)

Решение

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


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

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

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

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

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

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

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

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 

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

Пример: MimeMessageHelper helper = new MimeMessageHelper (message, true, «UTF-8»);

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