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

标签 java progress-bar imap jakarta-mail

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

Exception in thread "main" com.sun.mail.util.DecodingException: BASE64Decoder: Error in encoded stream: needed 4 valid base64 characters but only got 1 before EOF, the 10 most recent characters were: "Q3w5ilxj2P"

我找到了解释:

Certain IMAP servers do not implement the IMAP Partial FETCH functionality properly. This problem typically manifests as corrupt email attachments when downloading large messages from the IMAP server. To workaround this server bug, set the "mail.imap.partialfetch" property to false. You'll have to set this property in the Properties object that you provide to your Session.

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() 方法会阻塞线程,直到附件完全下载完毕,并且无法获取有关已从邮箱下载的字节数的信息。 没有这些信息就不可能显示进度条。那么有没有办法获取这些信息并显示进度条呢?

最佳答案

这很难。

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

如果您创建这样的东西,我相信其他人会对此非常感兴趣!

关于java - 如何显示下载附件的进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9086700/

相关文章:

java - 我可以向 Solr 服务器动态提供 solrconfig.xml 和 schema.xml 文件吗?

java - 向对等方发送 Hyperledger Fabric 的链码实例化请求时出现 OCI 运行时错误

c# - 如何在非长度特定任务或并行循环中使用进度条?

jquery - Bootstrap 进度条,渐变颜色按事件宽度按比例显示

java - 如何解析 JavaMail api 上的签名?

java - 通过主题实现启动屏幕后,ActionBar 抛出 NullPointerException

Java EE - 将图像上传到数据库?

C# WinForms 按钮不起作用

exchange-server - 如何通过 IMAP 抑制已读回执?

php - imap 电子邮件解析的编码