Javamail APIを使用していますが、単語ファイルなどの添付ファイルをダウンロードしようとしています。 問題は、バイトを読み込んでファイルに保存しようとしているときに、base64のデコード例外が発生することです。 私はその目的のために次のコードを使用しています。Javamailを使用してGmailから単語のドキュメントをダウンロードする
スタック例外:
IOException:com.sun.mail.util.DecodingException: BASE64Decoder: Error in encoded stream: needed 4 valid base64 characters but only got 2 before EOF, the 10 most recent characters were: "AG4AAAAAAA"
のJavaMailコード:
private void getAttachments(Message temp) throws IOException, MessagingException {
List<File> attachments = new ArrayList<File>();
Multipart multipart = (Multipart) temp.getContent();
System.out.println(multipart.getCount());
for (int i = 0; i < multipart.getCount(); i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
if (!Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())) {
continue; // dealing with attachments only
}
InputStream is = bodyPart.getInputStream();
File f = new File("C:\\Attachments\\" + bodyPart.getFileName());
// saveFile(bodyPart.getFileName(),is);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while (br.ready()) {
System.out.println(br.readLine());
}
saveFile(bodyPart.getFileName(),is);
attachments.add(f);
}
public static void saveFile(String filename,InputStream input)
{
System.out.println(filename);
try {
if (filename == null) {
//filename = File.createTempFile("VSX", ".out").getName();
return;
}
// Do no overwrite existing file
filename = "C:\\Attachments\\" + filename;
File file = new File(filename);
for (int i = 0; file.exists(); i++) {
file = new File(filename + i);
}
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
BufferedInputStream bis = new BufferedInputStream(input);
int aByte;
while ((aByte = bis.read()) >=0) {
bos.write(aByte);
}
bos.flush();
bos.close();
bis.close();
} // end of try()
catch (IOException exp) {
System.out.println("IOException:" + exp);
}
} //end of saveFile()
コードが正常に見えます。だからおそらくあなたの問題はJavaMail固有のコードにあります。そのコードと、例外のメッセージとスタックトレースを表示できますか? –
@RolandIllig コードを再度編集しました –
独自の保存ロジックをローリングするのではなく、MimeBodyPartからsaveFile()メソッドを直接呼び出すとどうなりますか? –