2011-03-15 2 views
1

De mon application je télécharger un fichier sur notre serveur en utilisant ce code de base (il est un peu plus que cela bien sûr, mais cela est essentiellement il)HttpPost fileupload perte de données

HttpParams params = new BasicHttpParams(); 
HttpConnectionParams.setConnectionTimeout(params, 15000); 
HttpConnectionParams.setSoTimeout(params, 5 * 60 * 1000); 
HttpClient client = new DefaultHttpClient(params); 
HttpPost post = new HttpPost("upload url"); 
HttpEntity requestEntity = (new FileEntity(tmpFile, "multipart/form-data;boundary="+boundary); 
post.setEntity(requestEntity); 
HttpResponse response = (HttpResponse) client.execute(post); 

Cela fonctionne bien la plupart du temps.

Pour certains téléphones fonctionnant sous Android 2.2+, le fichier reçu sur le serveur n'est pas complet. Les petites parties du fichier sont simplement manquantes, et les parties manquantes se trouvent à des emplacements différents du fichier chaque fois.

Nous avons vérifié cela en comparant le fichier de l'application par rapport à ce que est reçu sur le côté serveur. Du côté serveur, nous avons capturé des paquets avec tcpdump pour nous assurer que ce n'était pas un problème avec notre serveur web ou le code du serveur web.

Nous avons également vérifié les données avec tcpdump à partir du téléphone. Le fichier tcpdump du téléphone diffère des données que nous essayons d'envoyer. Pour un cas nous avons fait l'analyse sur le fichier tcpdump manque des données entre l'adresse 8d68 et 9000 du fichier. Les paquets de tcpdump s'alignent avec ces adresses (un paquet a une partie des données jusqu'à 8d68 et le paquet suivant a des données à partir de 9000).

Pour ces téléphones, le problème ne se produit que rarement. Parfois, les téléchargements de fichiers fonctionnent et le fichier entier est reçu intact de notre côté.

Cela se produit UNIQUEMENT pour les téléphones 2.2+. Il arrive pour une grande variété de téléphones, et une variété de transporteurs, et pour des centaines d'utilisateurs. Il semble se produire à la fois sur wifi et 3g sur la base des adresses IP vues du côté serveur. Ceci est anecdotique mais quand j'essaie d'obtenir cela sur mon Nexus au cours des 2 derniers jours, je l'ai vu arriver 6 fois et ces temps sont toujours là quand j'entre ou sort de la pièce près d'un certain wifi routeur. Le reste de la journée quand je suis au bureau sur un autre routeur wifi ou sur un réseau cellulaire, le problème ne se pose jamais. Ma théorie étant que l'application est occupée à envoyer des données et maintenant nous passons du wifi au réseau cellulaire ou vice versa, est-ce une idée stupide ou une possibilité?

Je peux placer les fichiers tcpdump et les fichiers de données quelque part si quelqu'un veut jeter un oeil. Quoi d'autre devrais-je étudier pour comprendre la raison de cela?

+0

comme je l'ai déjà dit, si vous pouvez répéter ce bug sur votre téléphone, installez tcpdump et voir ce qui sort exactement de votre téléphone. De cette façon, vous serez sûr que ce n'est pas l'application – Alex

+0

Salut Alex, j'ai finalement compris comment reproduire le bug sur mon téléphone à l'occasion et j'ai capturé le résultat avec tcpdump sur mon téléphone. Le tcpdump diffère du fichier que j'essaie d'envoyer (j'ai édité la question originale ci-dessus avec les détails). Des idées quoi essayer maintenant? – dweebo

+0

assez étrange en fait. Si vous lancez tcpdumb sur votre téléphone, il enregistre ce que le téléphone envoie. doute qu'il ait quelque chose avec votre réseau.vous pouvez essayer d'utiliser autre chose que httpmime. utiliser des flux. De cette façon, vous pouvez être sûr à 100% que vous envoyez des données correctes comme vous le faites vous-même et ne comptez pas sur d'autres bibliothèques .. Je le ferais d'abord ... alors si cela arrive encore. une prière peut-être? :) – Alex

Répondre

0

Je faisais face à un problème similaire lors du téléchargement des données binaires. J'ai compris que c'était un problème avec le code du serveur. Il y avait des filtres côté serveur, qui lisaient les requêtes entrantes et essayaient de les enregistrer. Le code essayait de mettre le flux entrant dans un type de chaîne de DS. C'est à cause de cela que les images binaires ont été déformées. Vérifiez simplement s'il y a des filtres côté serveur. Espérons que cela aide