Как отобразить индикатор выполнения для загрузки вложения - PullRequest
2 голосов
/ 01 февраля 2012

Я отображаю индикатор выполнения для загрузки вложений, и он работает нормально ... но когда я загружаю некоторые вложения, я получаю сообщение об исключении:

Исключение в теме "main" com.sun.mail.util.DecodingException: BASE64Decoder: Ошибка в закодированном потоке: необходимо 4 действительных символа base64, но только до 1 получилось EOF, 10 самых последних символов были: «Q3w5ilxj2P»

Я нашел объяснение:

Некоторые серверы IMAP не реализуют функцию IMAP Partial FETCH должным образом.Эта проблема обычно проявляется в поврежденных вложениях электронной почты при загрузке больших сообщений с сервера IMAP.Чтобы обойти эту ошибку сервера, установите для свойства mail.imap.partialfetch значение false.Вам нужно будет установить это свойство в объекте 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>");

это решило проблему…. Однако метод getInputStream () из класса Part блокирует поток до тех пор, пока вложение не будет полностью загружено, и невозможно получить информацию о количестве байтов, которые уже были загружены из почтового ящика.Без этой информации невозможно отобразить индикатор выполнения.Так есть ли способ получить эту информацию и отобразить индикатор выполнения?

1 Ответ

0 голосов
/ 01 февраля 2012

Это сложно.

Единственный известный мне подход - это создать собственную фабрику сокетов, которая производит специальный тип сокетов (вашего собственного дизайна), который возвращает InputStream, который оборачивает реальный сокет InputStream и позволяетвам контролировать объем данных, прочитанных в потоке.Это позволит вам измерить данные протокола IMAP, которые возвращаются с сервера клиенту.Он не сможет сказать вам, какой процент данных был возвращен (поскольку данные, которые вы измеряете, включают в себя все издержки протокола IMAP и накладные расходы на кодирование), но он должен позволить вам увидеть, что прогресс достигнут.

Если вы создадите что-то подобное, я уверен, что другие будут очень заинтересованы в этом!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...