如何显示下载附件的进度条

时间:2012-01-31 20:49:09

标签: java progress-bar imap javamail

我显示下载附件的进度条,它工作正常......但是当我下载一些附件时,我收到异常消息:

  

线程“main”中的异常com.sun.mail.util.DecodingException:   BASE64Decoder:编码流错误:需要4个有效的base64   字符,但在EOF之前只有1,最近的10个字符   是:“Q3w5ilxj2P”

我找到了解释:

  

某些IMAP服务器未实现IMAP部分FETCH   功能正常。这个问题通常表现为腐败   从IMAP下载大邮件时的电子邮件附件   服务器。要解决此服务器错误,请设置   “mail.imap.partialfetch”属性为false。你必须设置它   您提供给Session的Properties对象中的属性。

http://java.sun.com/products/javamail/NOTES113.txt

所以我关闭了部分抓取:

Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
props.setProperty("mail.imaps.partialfetch", "false");
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "<username>","<password>");

这解决了问题....然而,Part类中的方法getInputStream()阻塞了线程,直到完全下载了附件,并且无法获得有关已经从邮箱下载的字节数的信息。 如果没有此信息,则无法显示进度条。那么有没有办法获取这些信息并显示进度条?

1 个答案:

答案 0 :(得分:0)

很难。

我知道的唯一方法是创建自己的套接字工厂,生成一种特殊类型的套接字(由您自己设计),它返回一个包装真实套接字InputStream的InputStream,并允许您监视通过它读取的数据量流。这将允许您测量从服务器返回到客户端的IMAP协议数据。它将无法告诉您返回了多少百分比的数据(因为您测量的数据包括所有IMAP协议开销和编码开销),但它应该可以让您看到正在进行的进展。 / p>

如果你创造这样的东西,我相信其他人会对它很感兴趣!