【发布时间】:2014-11-26 07:57:37
【问题描述】:
我需要从 GMail 中获取附件并将其上传到 Amazon S3。
我正在使用 imap 连接到 GMail 并能够访问附件, 使用 javax.mail.internet.MimeBodyPart,它提供了 Base64DecoderStream 中的 getInputStream(),而不是 FileInputStream 或 ByteArray 输入流。 由于我的文件是二进制文件(如 .zip)。
我需要 InputStream 将其上传到 S3。
那么如何将 Base64DecoderStream 转换为 InputStream?
public void processMails() {
Properties props = new Properties();
props.setProperty("mail.store.protocol", "imaps");
Session session = null;
Store store = null;
session = Session.getInstance(props, null);
Folder inboxFolder;
try {
store = session.getStore();
store.connect("imap.gmail.com", "test@gmail.com", "password");
inboxFolder = store.getFolder("INBOX");
inboxFolder.open(Folder.READ_WRITE);
Message messages[] = inboxFolder.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false));
for (Message msg : messages) {
try {
Multipart multiPart = (Multipart)msg.getContent();
for (int i = 0; i < multiPart.getCount(); i++) {
MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(i);
if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
InputStream stream = null;// need to convert part.getInputStream() to InputStream
processAttachment(stream);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
//上传功能如下
public void processAttachment(InputStream asset) {
ObjectMetadata meta = new ObjectMetadata();
if (asset instanceof FileInputStream) {
meta.setContentLength(((FileInputStream)asset).available());
} else if (asset instanceof ByteArrayInputStream) {
meta.setContentLength(((ByteArrayInputStream)asset).available());
}
else {
meta.setContentLength(asset.available());
}
s3.putObject(new PutObjectRequest(bucket, "parentfolder/subfolder/abc.zip", asset, meta));
}
【问题讨论】:
标签: java amazon-s3 gmail inputstream attachment