Je développe une application Android qui permet à l'utilisateur de télécharger un fichier à des services comme Twitpic et d'autres. Le téléchargement POST est effectué sans bibliothèques externes et fonctionne correctement. Mon seul problème est, que je ne peux pas saisir aucun progrès parce que tout le téléchargement est fait quand je recevoir la réponse, pas pendant que écrit les octets dans le flux de sortie. Voici ce que je fais:Impossible de progresser sur le téléchargement de fichiers POST http (Android)
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());
J'écrire les données de formulaire à dos, ce qui est pas si important ici, maintenant. Après que j'écrire les données de fichier lui-même (la lecture de « in », qui est le InputStream des données que je veux envoyer):
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);
}
Après cela, j'envoie les données du formulaire multipart pour indiquer la fin de la fichier. Ensuite, je ferme les flux:
in.close();
dos.flush();
dos.close();
Tout cela fonctionne parfaitement bien, pas de problème jusqu'à présent. Mon problème est, cependant, que tout le processus jusqu'à ce point prend environ une ou deux secondes, peu importe la taille du fichier. Le téléchargement lui-même semble se produire quand je lis la réponse:
DataInputStream inStream = new DataInputStream(conn.getInputStream());
Cela prend plusieurs secondes ou minutes, selon la taille du fichier est et à quelle vitesse la connexion Internet. Mes questions sont maintenant: 1) Pourquoi l'uplaod ne se passe-t-il pas lorsque j'écris les octets à "dos"? 2) Comment puis-je obtenir une progression afin d'afficher une boîte de dialogue de progression pendant le téléchargement lorsque tout se produit en même temps?
/EDIT: 1) Je mets le Content-Length dans l'en-tête qui change le problème un peu, mais ne saurait en aucun façon résous: Maintenant tout le contenu est téléchargé après le dernier octet est écrit dans le flux. Donc, cela ne change pas la situation que vous ne pouvez pas saisir la progression, car encore une fois, les données sont écrites à la fois. 2) J'ai essayé MultipartEntity dans Apache HttpClient v4. Là, vous n'avez pas du tout un OutputStream, car toutes les données sont écrites lorsque vous effectuez la requête. Encore une fois, il n'y a aucun moyen de progresser.
Y a-t-il quelqu'un là-bas qui a une autre idée de la façon d'obtenir un processus dans un téléchargement multipart/formulaire?
Peut-être que cette réponse vous donnera quelques conseils: http://stackoverflow.com/questions/254719/file-upload-with-java-with-progress-bar/470047#470047 – pableu
@pableu : J'ai examiné cela. Le problème est: Il n'y a pas RequestEntity dans le SDK Android. Il fait partie d'Apache HttpClient 3.1, qui n'est plus utilisé par Android. Maintenant, j'ai même essayé de charger les nouvelles librairies 4.0.1, mais je ne vois aucune possibilité de progresser ici. D'autres idées? – Manuel