views:

27

answers:

1

I have an android app that is attempting to upload photos to a web server via API interface. The method works fine as long as the image sizes are not too big (fails somewhere around 1280x800) Heres the code that will work will smaller images but fails with larger ones. Any suggestions?

public void uploadPhoto(FileInputStream fileInputStream, String session_key) throws IOException, ClientProtocolException {

    URL connectURL = new URL(API_ENDPOINT_URL + "session_key="
            + session_key + "&method=" + ApiMethods.UPLOAD_PHOTO);
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";

    HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();

    // Allow Inputs
    conn.setDoInput(true);

    // Allow Outputs
    conn.setDoOutput(true);

    // Don't use a cached copy.
    conn.setUseCaches(false);

    // Use a post method.
    conn.setRequestMethod("POST");

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

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

    DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

    dos.writeBytes(twoHyphens + boundary + lineEnd);
    // Log.d(TAG, "  dos1: " + dos);
    dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""+ "file.png" + "\"" + lineEnd);
    // Log.d(TAG, "  dos2: " + dos);
    dos.writeBytes(lineEnd);
    // Log.d(TAG, "  dos3: " + dos);

    // create a buffer of maximum size

    int bytesAvailable = fileInputStream.available();
    int maxBufferSize = 1024;
    int bufferSize = Math.min(bytesAvailable, maxBufferSize);
    byte[] buffer = new byte[bufferSize];

    // read file and write it into form...

    int bytesRead = fileInputStream.read(buffer, 0, bufferSize);
    Log.d(TAG, " BytesREad:" + bytesRead);
    while (bytesRead > 0) {
        Log.d(TAG, " BytesREad in while:" + bytesRead);
        dos.write(buffer, 0, bufferSize);
        // Log.d(TAG, "  dos3: " + dos);
        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        /*
         * dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary +
         * twoHyphens + lineEnd);
         */
    }

    // send multipart form data necesssary after file data...

    // dos.write(data);
    dos.writeBytes(lineEnd);
    dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
    // Log.d(TAG, "  dos4 tostring: " + dos.toString());

    // close streams
    // Log.e(Tag,"File is written");
    // fileInputStream.close();
    dos.flush();
    // Log.d(TAG, "  dos5: " + dos.toString());
    InputStream is = conn.getInputStream();
    // retrieve the response from server
    int ch;

    StringBuffer b = new StringBuffer();
    while ((ch = is.read()) != -1) {
        b.append((char) ch);
        // Log.d(TAG, "  b: " + b.toString());
    }
    String s = b.toString();
    Log.i("Response", s);
    // Log.d(TAG, "   response:" + s);
    dos.close();

}

The errors include

10-20 04:16:26.658: ERROR/dalvikvm-heap(20213): 8957952-byte external allocation too large for this process. 10-20 04:16:26.658: ERROR/dalvikvm(20213): Out of memory: Heap Size=4551KB, Allocated=3039KB, Bitmap Size=9496KB 10-20 04:16:26.658: ERROR/(20213): VM won't let us allocate 8957952 bytes

+1  A: 

I had very similar problem before, turned out not to be uploading the picture but because I was trying to display it on an activity..

Dave
This allowed the program to not crash, but still wont complete the upload so I think i'm running into the same problem
Brian Perin