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
очевидно, вы можете получить один из них из файла и использовать его вместо этого.