Android httpclient de téléchargement de fichiers de données de la corruption et des problèmes de délai d'attente
je vais avoir des problèmes avec le téléchargement des images dans android.
je suis en utilisant apache httpmime 4.1 lib
le code ressemble à ceci:
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("image", new FileBody(new File(AndorraApplication.getPhotosPath() + "/" + entity.getFileName()), "image/jpeg"));
resp = NetworkUtils.sendHttpRequestMultipart(EXPORT_PHOTOS_URI, reqEntity);
NetworkUtils classe:
public class NetworkUtils {
public static final int REGISTRATION_TIMEOUT = 3 * 1000;
public static final int WAIT_TIMEOUT = 5 * 1000;
public static HttpResponse sendHttpRequestMultipart(String uri, MultipartEntity entity) {
HttpClient mHttpClient = new DefaultHttpClient();
final HttpParams params = mHttpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT);
ConnManagerParams.setTimeout(params, WAIT_TIMEOUT);
HttpPost post = new HttpPost(uri);
post.addHeader(entity.getContentType());
post.setEntity(entity);
HttpResponse resp = mHttpClient.execute(post);
}
}
parfois tout fonctionne bien, mais parfois (surtout sur une connexion lente) l'image est téléchargée très endommagé. l'exemple est ici: http://pixelbirthcloud.com/574_orig.jpg
il ne jette pas des exceptions. la longueur du fichier téléchargé est le même que l'original.. essayé de changer le type mime application/octet-stream ou de le supprimer à tout. essaie de jouer avec des délais d'attente. toujours le même résultat. utilisateurs finaux de télécharger des images corrompues presque tout le temps (bien que j'ai réussi à obtenir bronem images seulement 2 fois seulement).. la taille de l'image était de 2,5 mo au début, mais ensuite j'ai ramené de 500 à 700 ko. n'a pas de résoudre le problème.
n'ai pas essayé de changer le apache de la bibliothèque.. c'est peut-être le problème.. mais autant que j'ai lu sur le net, personne n'a rencontré ce avec httpmime bibliothèque.
que peut-il être? je suis complètement perdu maintenant 🙁
l'autre problème est que les délais d'attente parfois ne fonctionne pas.
comme quand il s'agit de cette ligne:
HttpResponse resp = mHttpClient.execute(la poste);
et j'ai désactiver la connexion 3g il attend simplement comme 17-20 minutes au lieu de 3 ou 5 secondes.. et alors seulement, déclenche une exception. essayé différentes méthodes. comme ceci:
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
HttpProtocolParams.setUseExpectContinue(params, false);
HttpConnectionParams.setConnectionTimeout(params, 10000);
HttpConnectionParams.setSoTimeout(params, 10000);
ConnManagerParams.setMaxTotalConnections(params, 5);
ConnManagerParams.setTimeout(params, 30000);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https",PlainSocketFactory.getSocketFactory(), 80));
ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry);
HttpClient httpclient = new DefaultHttpClient(manager, params);
mais ne fonctionne toujours pas 🙂
OriginalL'auteur Alex | 2011-02-04
Vous devez vous connecter pour publier un commentaire.
Voir Mon Code de l'Image à Uploader et il a très bien fonctionné pour moi
Cette classe Télécharge un fichier sur le serveur et à la fin, lire le fichier XML de réponse également.
Filtre le code selon vos besoins.. Cela a fonctionné assez lisse pour moi
peut finir par faire quelque chose comme ça, je suppose... si elle n'était pas de répondre à la question, mais je vous remercie.. vu une telle solution sur le net, mais a décidé d'aller un moyen plus pratique - à l'aide de httpcomponents.. mais a échoué pour une raison 🙁
ses une classe complète nous avons juste besoin de passer tha fichier de l'url et l'url du script. ce serait plus pratique que de ce
httpmime de la bibliothèque. =) beaucoup plus facile à utiliser en fait. fait ma propre catégorie sur cette base. prend des fichiers texte ou params... espérons qu'il sera workin la façon dont j'attends =) merci à vous
remarqué de 1 chose: le ralentissement de la connexion, le plus corrompu les images sont
OriginalL'auteur Javanator
J'ai eu le même problème de corruption sur 80% de mes fichiers téléchargés. L'émulateur n'a pas manqué de les télécharger. Des fichiers corrompus ont été 1k de plus grandes que celles d'origine. Puis j'ai mis le tampon du flux de sortie à 1 octet, et il a commencé à travailler avec aucun problème. Enfin je l'ai laissé de 8 octets et n'ont pas eu non plus de problèmes de corruption. Une zone tampon d'environ 80 ou 50, je ne me souviens pas, ont également échoué. Ne comprends pas quel est le problème, mais je suis content que ça fonctionne de cette façon. Cette page a été une source d'inspiration grâce.
OriginalL'auteur Turbini
ok. passé 2 jours sur le test de ce problème et a trouvé suivantes:
lors de l'utilisation de tcpdump sur android, il arrive que les données n'ont pas été corrompu, MAIS le paquet tcp taille est 1516, ce qui est très étrange, à cause de l'ethernet normal à la taille du paquet est de 1500 et tout, plus 1516, est bien trop gros.
j'ai modifié manuellement le MTU à 576 (je crois que c'est la norme pour les ppp, qui 3G est effectivement) et il fonctionne parfaitement! 150 de 150 images, ont été téléchargés normalement!
cela ne résout pas le problème réel, mais il est impossible de changer le mtu sur la non-enracinée appareils, je crois, et vous devez le changer chaque fois que vous redémarrez l'appareil (ou chaque fois que vous faites l'interface - pas sûr à ce sujet, la cause n'arrivais pas à trouver le moyen d'obtenir une valeur MTU via ifconfig). mais au moins, je sais où est le problème.
réglage http morceau d'une taille à une valeur plus petite (essayé 300 octets) n'a pas l'affecter (je crois que c'est parce que les en-têtes http sont bien trop gros eux-mêmes)... donc... donc rien =)
vais essayer de poster pour android-groupe des développeurs sur google, mais leur modération est beaucoup trop lent... on va voir...
si il vous manque des pièces du dossier, alors c'est un autre problème. si vous utilisez mediastore, vous devriez regarder dans froyo d'un bug avec la mauvaise longueur du fichier. cause si la longueur du fichier sur le serveur est différent, mais il reçoit toujours le fichier, cela signifie que le contenu de longueur est faux, autrement il serait juste de refuser le téléchargement en raison de différentes longueur du fichier...
Merci Alex, nous avons vérifié que les données créées par l'application est correcte, mais la version que nous recevons sur le serveur est incorrect. la taille du fichier EST différent. nous ne sommes pas à l'aide de mediastore de sorte que la taille de fichier froyo bug n'est pas notre problème, c'est autre chose. vérifié que cela se produit uniquement avec Android 2.2+, mais sur une gamme de téléphones et les transporteurs et ça se passe à des centaines de nos utilisateurs
j'ai un fort sentiment que ce n'est pas un androïde question. comment vérifiez-vous que les données sur android est-il correct? exécuter un tcpdump pour voir ce qui se passe exactement à partir de l'appareil. il y a peut être 3 questions: 1) la connexion est accidentellement cassé dans le milieu du processus. dans ce cas, vous avez des données tronquées. signifie qu'il n'y aura pas de différence entre les mêmes blocs de données sur le serveur et le client. 2) les données peuvent être transférées dans pas le mode binaire.. 3) votre IO algo sur android est inexacte. le mieux est de vérifier pour tcpdump. seulement de cette façon vous serez sûr à 100%. vous pouvez utiliser wireshark pour analyser le dump
Merci pour votre aide Alex, car c'est probablement un autre problème que vous avez eu. Je suis d'accord il ne semble pas que ce serait un android problème, puisque personne d'autre dans l'univers semble avoir à y arriver. nous avons vérifié les fichiers sont corrects dans l'application de quelques utilisateurs avec le problème de nous envoyer les fichiers de données qui sont envoyés par l'application et nous avons vérifié, et ils sont dans le bon format, alors que les versions que nous mettre sur notre serveur sont différents et manquant aléatoire des pièces du dossier, mais les pièces manquantes sont dans le MILIEU du fichier, ce n'est pas seulement un problème de troncature.
OriginalL'auteur Alex