Я разрабатываю приложение для 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 вообще, потому что все данные записываются при выполнении запроса. Таким образом, нет никакого способа добиться прогресса.
Есть ли кто-нибудь, кто имеет какую-либо другую идею, как захватить процесс в многостраничной/форме загрузки?