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