1

I am working in android. I am designing a program to upload a file to the http server.

but whenever i run this program and select a file which is a little bit more in size then this will generate following error.

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)

this is my file for upload:-

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;
}

please help me what should i do to upload file of a little more big size like as mp3 file. Thank you in advance...

KV Prajapati
  • 93,659
  • 19
  • 148
  • 186
Pushpendra Kuntal
  • 6,118
  • 20
  • 69
  • 119

3 Answers3

6

I resolved my problem myself.

This is the changes which are made by me in my java file:-

     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);

In my problem this following code is replaced:-

  while (bytesRead > 0)
 {


    dos.write(buffer, 0, bufferSize);

    bytesAvailable = fileInputStream.available();

    bufferSize = Math.min(bytesAvailable, maxBufferSize);

    bytesRead = fileInputStream.read(buffer, 0, bufferSize);
   }
hemantsb
  • 2,049
  • 2
  • 20
  • 29
Pushpendra Kuntal
  • 6,118
  • 20
  • 69
  • 119
  • 1
    i didn't get it, how can u replace the while loop? can u pls tell what exact code did u add inside the while loop? while (bytesRead > 0) – ghostCoder Feb 13 '12 at 10:27
  • He can't. With this solution he can only upload files up to one megabyte (his maxBufferSize). – marsbear Aug 26 '15 at 14:47
4

Unfortunately this did not solve the problem for me. However, this post:

Unable to write into DataOutputStream beyond a specific size - OutOfMemoryError

saved the day.

On your HttpConnection, you should use HttpURLConnection.setFixedLengthStreamingMode, or HttpURLConnection.setChunkedStreamMode. Otherwise, nothing will actually be transferred to the server and you will hit the memory limit.

You can use WireShark to actually inspect the traffic between your client and server to confirm this.

Community
  • 1
  • 1
Mart135688
  • 1,047
  • 7
  • 3
2

Just add android:largeHeap="true" in your manifest file

Ref: largeHeap=true manifest tag not working?

Community
  • 1
  • 1
Mayura
  • 91
  • 1
  • 1