Java прикрепить файл из виртуальной файловой системы к электронной почте

Я использую виртуальную файловую систему, и я хотел бы прикрепить файл из нее к электронной почте. Однако объект MimeBodyPart принимает только файлы, которые не работают в файловой системе по умолчанию, такой как jimfs. См. Мой код ниже, где я получаю исключение UnsupportedOperation при попытке преобразовать в файл.

public Email attach(Path file){
    MimeBodyPart attachment = new MimeBodyPart()
    attachment.attachFile(file.toFile())
    attachments.add(attachment)
    return this
}

2 ответа

Решение

Поскольку файлы jimfs на самом деле не являются файлами, вы не можете использовать файловые API.

Простой обходной путь - использовать ByteArrayDataSource, который будет копировать данные.

Лучшим подходом было бы написать свой собственный PathDataSource, который похож на FileDataSource, но использует File.newInputStream вместо FileInputStream. Затем прикрепите файл, используя:

MimeBodyPart mbp = new MimeBodyPart();
mbp.setDataHandler(new DataHandler(new PathDataSource(path)));
mbp.setFileName(path.getFileName().toString());
mbp.setDisposition(Part.ATTACHMENT);

Что бы это ни было MimeBodyPart API действительно должен иметь возможность использовать Path так что вы можете просто использовать файл Jimfs напрямую, но так как java.nio.file API требуют Java 7 и не работают на Android, но многие библиотеки, к сожалению, не поддерживают Path еще.

toFile() никогда не может работать для файла Jimfs или для любого файла, который не находится в файловой системе по умолчанию, потому что File Класс может представлять файлы только в файловой системе по умолчанию. Так что да, вам нужно скопировать файл Jimfs в настоящую файловую систему, чтобы использовать это attachFile метод.

Если MimeBodyPart API имел возможность использовать URL или же URI для вложения, вы, вероятно, сможете использовать этот плюс file.toUri()[.toURL()], Или если бы он мог использовать, скажем, InputStream очевидно, вы можете получить один из них из файла и использовать его вместо этого.

Другие вопросы по тегам