2013-07-19 2 views
3

Les téléchargements de code suivant fichier sur le serveur:Android File Upload question crash

import org.apache.http.HttpResponse; 
import org.apache.http.HttpStatus; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.params.BasicHttpParams; 
import org.apache.http.params.HttpConnectionParams; 
import org.apache.http.params.HttpParams; 

public String uploadFileForStorage(String serverUrl, String filePath) { 
StringBuilder responseMsg = new StringBuilder(); 
    try { 
     final File file = new File(filePath); 
     HttpParams httpParameters = new BasicHttpParams(); 
     // Set the timeout in milliseconds until a connection is 
     // established. 
     HttpConnectionParams.setConnectionTimeout(httpParameters, UPLOAD_CONNECTION_TIME_OUT); 
     // Set the default socket timeout (SO_TIMEOUT) 
     // in milliseconds which is the timeout for waiting for data. 
     HttpConnectionParams.setSoTimeout(httpParameters, UPLOAD_SOCKET_TIME_OUT); 

     HttpClient httpClient = new DefaultHttpClient(httpParameters); 

     if (serverUrl.contains("?")) { 
      serverUrl = Utils.getProperUrlWithOutEncode(serverUrl); 
     } 

     HttpPost postRequest = new HttpPost(serverUrl); 
     FileBody bin = new FileBody(file); 

     CustomMultiPartEntity multipartContent = new CustomMultiPartEntity(new ProgressListener() { 
         @Override 
         public void transferred(long num) { 
          total = total + num; 
         } 
        }); 
        multipartContent.addPart(CUSTOM_FILE_TAG, bin); 
        postRequest.setEntity(multipartContent); 
        HttpResponse response = httpClient.execute(postRequest); 
        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
         BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
         String sResponse; 
         while ((sResponse = reader.readLine()) != null) { 
          responseMsg = responseMsg.append(sResponse); 
         } 
        } else { 
         responseMsg = responseMsg.append(String.valueOf(response.getStatusLine().getStatusCode())); 
        } 
       } catch (Exception e) { 
        isError = true; 
       } 
       return responseMsg.toString(); 
      } 

     } 

Les fichiers sont en cours de téléchargement de Tablet SDCard. Le code ci-dessus fonctionne très bien avec plusieurs tablettes Android comme Samsung Galaxy Note 10.1 & Micromax Funbook 10 pouces, mais se bloque lors du téléchargement de fichiers dans Samsung P6200. L'accident ne se produit pas immédiatement, mais après 5-10% de téléchargement.

Auparavant, le téléchargement fonctionnait bien sur Samsung P6200 aussi. J'ai fait la réinitialisation d'usine de la tablette, mais le blocage au téléchargement persiste. En outre, OutOfMemoryException n'est pas affiché dans le logcat. Le journal affiche NullPointerException dans un fichier de classe qu'il ne doit pas. En supposant que le problème soit un problème HeapSize, comment puis-je gérer le problème.

En utilisant le code ci-dessus, je suis en mesure de télécharger le fichier jusqu'à 400 Mo de carte SD en utilisant la carte SIM (3G/WiFi) avec tablettes Android comme Samsung Galaxy Note 10.1 & Micromax funBOOK 10.

devrait ajouter la ligne suivante de aide de code?

HttpConnectionParams.setSocketBufferSize(httpParameters, 8192); 
// or any value other than //8192 
+2

Pouvez-vous publier logcat pour le cas d'erreur? Il peut aider à localiser l'erreur, mais de toute façon regarder http://stackoverflow.com/questions/4455006/posting-a-large-file-in-android – Slartibartfast

+1

"Le journal montre NullPointerException dans un fichier de classe qu'il ne devrait pas. ". Vous avez vraiment besoin d'inclure des informations comme celle-ci. –

+0

Reuben Scratton: Obtenir une exception NullPointer dans une activité où la mise en page ne comprend qu'un bouton qui, une fois cliqué, lancera le processus de téléchargement. Dans les scénarios où le processus de téléchargement est réussi, l'exception NullPointerException n'est jamais levée. C'est la raison pour ne pas entrer les détails dans la question. Je ne pense pas que le NullPointerException est la cause réelle de l'accident, il aurait été jeté dans tous les scénarios. – chiranjib

Répondre

0
   postRequest.setEntity(multipartContent); 
       HttpResponse response = httpClient.execute(postRequest); 

Si les problèmes de tas suspect, alors vous devriez vérifier dans la mise en œuvre/source de votre httpclient. Je suppose que vous utilisez un client apache, vous pouvez donc vérifier là-bas.

Il y a 2 problèmes de mémoire.

Lorsque la balise de fichier est mappée à la mémoire (avant d'utiliser le socket) quelle est la taille et quel type de tampon est utilisé? Vous devrez peut-être creuser dans le code qui mappe le fichier en mémoire et le rendre conforme à la plus petite taille de mémoire/tampon disponible.

Une fois que le socket entre en action pour le téléchargement, le client.execute utilise un autre cycle de tampon pour lire dans la mémoire de fichiers et écrire dans la socket utilisée pour le téléchargement. En plus de jouer avec config sur la taille de la mémoire tampon du socket, vous pouvez aussi essayer de 'coder en morceau' (streaming) avec le téléchargement. Vider vos en-têtes et vous devriez être en mesure de voir si le formulaire MIME Multipart que vous utilisez conduit à l'en-tête http de "chunked-encoding".

Pour example with httpUrlConnection segmenté qui fonctionnerait avec de gros téléchargements. trouver "ChunkedStreamingMode" dans la source.