Я занимаюсь разработкой приложения для Android, которое позволяет пользователю загружать файлы в такие службы, как Twitpic и другие.
Загрузка POST выполняется без каких-либо внешних библиотек и работает просто отлично. Моя единственная проблема в том, что я не могу получить никакого прогресса, потому что вся загрузка выполняется, когда я получаю ответ, а не , записывающий байты в выходной поток.
Вот что я делаю:
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
Затем я записываю данные формы в dos, что сейчас не так важно. После этого я записываю данные самого файла (считывая из «in», который является InputStream данных, которые я хочу отправить):
while ((bytesAvailable = in.available()) > 0)
{
bufferSize = Math.min(bytesAvailable, maxBufferSize);
byte[] buffer = new byte[bufferSize];
bytesRead = in.read(buffer, 0, bufferSize);
dos.write(buffer, 0, bytesRead);
}
После этого я отправляю данные многочастной формы, чтобы указать конец файла. Затем я закрываю потоки:
in.close();
dos.flush();
dos.close();
Все это прекрасно работает, проблем пока нет. Моя проблема, однако, в том, что весь процесс до этого момента занимает около одной или двух секунд, независимо от размера файла.
Сама загрузка, кажется, происходит, когда я читаю ответ:
DataInputStream inStream = new DataInputStream(conn.getInputStream());
Это занимает несколько секунд или минут, в зависимости от размера файла и скорости интернет-соединения.
Мои вопросы сейчас:
1) Почему не происходит uplaod, когда я записываю байты в "dos"?
2) Как я могу получить прогресс, чтобы показать диалог прогресса во время загрузки, когда все это происходит одновременно?
/ EDIT:
1) Я устанавливаю Content-Length в заголовке, который немного меняет проблему, но не в любом
способ решить это:
Теперь весь контент загружается после записи последнего байта в поток. Таким образом, это не меняет ситуацию, когда вы не можете отследить прогресс, потому что снова данные записываются сразу.
2) Я попробовал MultipartEntity в Apache HttpClient v4. Там у вас вообще нет OutputStream, потому что все данные записываются при выполнении запроса. Опять же, нет никакого способа добиться прогресса.
Есть ли кто-нибудь, кто имеет какую-либо другую идею, как получить процесс при загрузке из нескольких частей / форм?