Não é possível obter progresso no upload de arquivo http POST (Android)
Estou desenvolvendo um aplicativo Android que permite ao usuário enviar um arquivo para serviços como o Twitpic e outros. O upload do POST é feito sem bibliotecas externas e funciona perfeitamente. Meu único problema é que não consigo obter nenhum progresso porque todo o carregamento é feito quandoreceber a resposta, não enquantoescrita os bytes no fluxo de saída. Aqui está o que eu faço:
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());
Depois, escrevo os dados do formulário no DOS, o que não é tão importante aqui, agora. Depois disso, escrevo os dados do arquivo (leitura de "in", que é o InputStream dos dados que desejo enviar):
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);
}
Depois disso, envio os dados do formulário de várias partes para indicar o final do arquivo. Então, eu fecho os fluxos:
in.close();
dos.flush();
dos.close();
Tudo isso funciona perfeitamente bem, sem problemas até agora. Meu problema, no entanto, é que todo o processo até esse momento leva cerca de um ou dois segundos, independentemente do tamanho do arquivo. O upload em si parece acontecer quando li a resposta:
DataInputStream inStream = new DataInputStream(conn.getInputStream());
Isso leva alguns segundos ou minutos, dependendo do tamanho do arquivo e da rapidez da conexão com a Internet. Minhas perguntas agora são: 1) Por que o aplauso não acontece quando eu escrevo os bytes em "dos"? 2) Como posso obter um progresso para mostrar uma caixa de diálogo de progresso durante o upload, quando tudo acontece ao mesmo tempo?
/ EDIT: 1) Defino o comprimento do conteúdo no cabeçalho que altera um pouco o problema, mas não o resolve de forma alguma: agora todo o conteúdo é carregado após o último byte ser gravado no fluxo. Portanto, isso não muda a situação em que você não pode obter o progresso, porque, novamente, os dados são gravados de uma só vez. 2) Tentei o MultipartEntity no Apache HttpClient v4. Lá você não tem um OutputStream, porque todos os dados são gravados quando você executa a solicitação. Então, novamente, não há como obter um progresso.
Existe alguém por aí que tenha alguma outra idéia de como obter um processo em um upload de várias partes / formulário?