2011-10-15 1 views
1

Je travaille dans android. Je suis en train de concevoir un programme pour télécharger un fichier sur le serveur http. Mais quand j'exécute ce programme et que je sélectionne un fichier qui a un peu plus de taille, cela va générer une erreur de suivi.sur Erreur de mémoire dans android

java.lang.OutOfMemoryError 

    at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:93) 


    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:218) 

ERROR/AndroidRuntime(557):  at 

org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl$DefaultHttpOut 

putStream.write(HttpURLConnectionImpl.java:750) 


10-15 03:08:32.113: ERROR/AndroidRuntime(557):  at 

java.io.DataOutputStream.write(DataOutputStream.java:101) 

ceci est mon fichier à télécharger: -

HttpURLConnection conn = null; 
     DataOutputStream dos = null; 

     DataInputStream inStream = null; 



     String existingFileName = "/mnt/sdcard/kuntal.PNG"; 


     Log.v("File upload",""+Environment.getExternalStorageDirectory().getAbsolutePath()); 
     String lineEnd = "\r\n"; 

     String twoHyphens = "--"; 

     String boundary = "*****"; 

     int bytesRead, bytesAvailable, bufferSize; 

     byte[] buffer; 

     int maxBufferSize = 1*1024*1024; 

     String responseFromServer = ""; 

     Log.v(TAG,"url= "); 

     String urlString = "http://192.168.1.126/MusicApplication/uploadmusic.php?title="+title_by_artist+"&category="+category_of_song+"&filename="+filename+"&price="+price_of_song+"&artist="+HomePageActivity.username; 
     Log.v(TAG,"url= "+urlString); 
     try 
     { 
     //------------------ CLIENT REQUEST 
     FileInputStream fileInputStream = new FileInputStream(new File(existingFileName)); 

     // open a URL connection to the Servlet 

     URL url = new URL(urlString); 

     // Open a HTTP connection to the URL 

     conn = (HttpURLConnection) url.openConnection(); 

     // Allow Inputs 
     conn.setDoInput(true); 

     // Allow Outputs 
     conn.setDoOutput(true); 

     conn.setUseCaches(false); 

     conn.setRequestMethod("POST"); 

     conn.setRequestProperty("Connection", "Keep-Alive"); 

     conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); 

     dos = new DataOutputStream(conn.getOutputStream()); 
     dos.writeBytes(twoHyphens + boundary + lineEnd); 

     dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + existingFileName + "\"" + lineEnd); 

     dos.writeBytes(lineEnd); 

     // create a buffer of maximum size 

     bytesAvailable = fileInputStream.available(); 

     bufferSize = Math.min(bytesAvailable, maxBufferSize); 

     buffer = new byte[bufferSize]; 
     // read file and write it into form... 
     bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
     while (bytesRead > 0) 
     { 
      dos.write(buffer, 0, bufferSize); 

      bytesAvailable = fileInputStream.available(); 

      bufferSize = Math.min(bytesAvailable, maxBufferSize); 

      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

     } 
     // send multipart form data necesssary after file data... 
     dos.writeBytes(lineEnd); 
     dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 
     // close streams 
     Log.e("Debug","File is written"); 
     fileInputStream.close(); 
     dos.flush(); 
     dos.close(); 
     Toast.makeText(this, "File Successfully Uploaded", Toast.LENGTH_SHORT).show(); 

     } 
     catch (MalformedURLException ex) 
     { 
      Log.e("Debug", "error: " + ex.getMessage(), ex); 
     } 
     catch (IOException ioe) 
     { 
      Log.e("Debug", "error: " + ioe.getMessage(), ioe); 
     } 
     //------------------ read the SERVER RESPONSE 
     try { 
       inStream = new DataInputStream (conn.getInputStream()); 
       String str; 

       while ((str = inStream.readLine()) != null) 
       { 
        Log.e("Debug","Server Response "+str); 
       } 
       inStream.close(); 

     } 
     catch (IOException ioex){ 
      Log.e("Debug", "error: " + ioex.getMessage(), ioex); 
     } 
     } 




**and this is my php file for upload:-** 


if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) 
{ 



    echo "The file ". basename($_FILES['uploadedfile']['name']). 
    " has been uploaded"; 
    chmod ("Songs/".basename($_FILES['uploadedfile']['name']), 0644); 
} 
else 
{ 

    echo "filename: " . basename($_FILES['uploadedfile']['name']); 
    echo "target_path: " .$target_path; 
} 

s'il vous plaît aidez-moi ce que dois-je faire pour télécharger le fichier d'une petite taille plus grande comme en format MP3. Merci d'avance ...

Répondre

6

J'ai résolu mon problème moi-même.

Ce sont les changements qui sont faits par moi dans mon dossier java: -

 buffer = new byte[bufferSize]; 

    bufferSize = Math.min(bytesAvailable, maxBufferSize); 


    byte byt[]=new byte[bufferSize]; 

    fileInputStream.read(byt); 

    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

    dos.write(buffer, 0, bufferSize); 

Dans mon problème ce qui suit code est remplacé: -

while (bytesRead > 0) 
{ 


    dos.write(buffer, 0, bufferSize); 

    bytesAvailable = fileInputStream.available(); 

    bufferSize = Math.min(bytesAvailable, maxBufferSize); 

    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
    } 
+1

je ne comprenais pas, comment peut-u remplacer la boucle while? pouvez-vous dire quel code exact avez-vous ajouté dans la boucle while? while (bytesRead> 0) – ghostCoder

+0

Il ne peut pas. Avec cette solution, il ne peut télécharger que des fichiers jusqu'à un mégaoctet (son maxBufferSize). – marsbear

4

Malheureusement, cela n'a pas résolu le problème pour moi. Cependant, ce poste:

Unable to write into DataOutputStream beyond a specific size - OutOfMemoryError

a sauvé la journée. Sur votre HttpConnection, vous devez utiliser HttpURLConnection.setFixedLengthStreamingMode ou HttpURLConnection.setChunkedStreamMode. Sinon, rien ne sera transféré sur le serveur et vous atteindrez la limite de mémoire.

Vous pouvez utiliser WireShark pour inspecter réellement le trafic entre votre client et votre serveur pour le confirmer.

2

Il suffit d'ajouter android: largeHeap = "true" dans votre fichier manifeste

Ref: largeHeap=true manifest tag not working?

+0

cette étiquette dans le travail manifeste pour moi. Je suis en train de traiter du gros PDF, et sans cette balise, j'ai une erreur OutOfMemory. –

Questions connexes