2011-10-15 56 views
0

我正在使用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() 
+1

您发布的代码看起来不错。所以可能你的问题在于JavaMail特定的代码。你能告诉我们该代码,以及异常的消息和堆栈跟踪吗? –

+0

@RolandIllig 我再次编辑了代码 –

+0

当您直接从MimeBodyPart中调用saveFile()方法而不是滚动自己的保存逻辑时会发生什么? –

回答

0

使用saveFile的()从MimeBodyPart的方法。如果你真的想在输入流中将自己的stop(!)行读入到saveFile方法之前。您正在消耗部分内容,这可能会导致问题。

1

您需要禁用部分提取才能摆脱此问题。这里是你如何能做到这一点

props.setProperty("mail.imap.partialfetch", "false"); 

props.setProperty("mail.imaps.partialfetch", "false"); 

如果您正在使用IMAPS工作。

以下是完整的参考: JavaMail BaseEncode64 Error

+0

如果这不能解决它,该怎么办?我已经设置了properties.setProperty(“mail.imaps.partialfetch”,“false”); (我也尝试设置“mail.imap.partialfetch”,这也没有帮助),但我仍然得到类似的异常“BASE64Decoder:编码流中的错误:需要4个有效的base64字符,但只有1之前EOF“ – David

+0

你能分享你的代码库和错误细节吗? –

+0

忽视我的评论,这实际上只是一个格式不正确的BASE64内容! :) – David