Upload large file in Android without outofmemory error Upload large file in Android without outofmemory error android android

Upload large file in Android without outofmemory error


Did you try using

con.setChunkedStreamingMode(1024);

This will help you to chunk your data into specific size, so that you need not keep your entire file in the memory.

UPDATE:

Try using the below method. I use this method to upload a 80 mb file without Exception.

public String sendFileToServer(String filename, String targetUrl) {    String response = "error";    Log.e("Image filename", filename);    Log.e("url", targetUrl);    HttpURLConnection connection = null;    DataOutputStream outputStream = null;    // DataInputStream inputStream = null;    String pathToOurFile = filename;    String urlServer = targetUrl;    String lineEnd = "\r\n";    String twoHyphens = "--";    String boundary = "*****";    DateFormat df = new SimpleDateFormat("yyyy_MM_dd_HH:mm:ss");    int bytesRead, bytesAvailable, bufferSize;    byte[] buffer;    int maxBufferSize = 1 * 1024;    try {        FileInputStream fileInputStream = new FileInputStream(new File(                pathToOurFile));        URL url = new URL(urlServer);        connection = (HttpURLConnection) url.openConnection();        // Allow Inputs & Outputs        connection.setDoInput(true);        connection.setDoOutput(true);        connection.setUseCaches(false);        connection.setChunkedStreamingMode(1024);        // Enable POST method        connection.setRequestMethod("POST");        connection.setRequestProperty("Connection", "Keep-Alive");        connection.setRequestProperty("Content-Type",                "multipart/form-data;boundary=" + boundary);        outputStream = new DataOutputStream(connection.getOutputStream());        outputStream.writeBytes(twoHyphens + boundary + lineEnd);        String connstr = null;        connstr = "Content-Disposition: form-data; name=\"uploadedfile\";filename=\""                + pathToOurFile + "\"" + lineEnd;        Log.i("Connstr", connstr);        outputStream.writeBytes(connstr);        outputStream.writeBytes(lineEnd);        bytesAvailable = fileInputStream.available();        bufferSize = Math.min(bytesAvailable, maxBufferSize);        buffer = new byte[bufferSize];        // Read file        bytesRead = fileInputStream.read(buffer, 0, bufferSize);        Log.e("Image length", bytesAvailable + "");        try {            while (bytesRead > 0) {                try {                    outputStream.write(buffer, 0, bufferSize);                } catch (OutOfMemoryError e) {                    e.printStackTrace();                    response = "outofmemoryerror";                    return response;                }                bytesAvailable = fileInputStream.available();                bufferSize = Math.min(bytesAvailable, maxBufferSize);                bytesRead = fileInputStream.read(buffer, 0, bufferSize);            }        } catch (Exception e) {            e.printStackTrace();            response = "error";            return response;        }        outputStream.writeBytes(lineEnd);        outputStream.writeBytes(twoHyphens + boundary + twoHyphens                + lineEnd);        // Responses from the server (code and message)        int serverResponseCode = connection.getResponseCode();        String serverResponseMessage = connection.getResponseMessage();        Log.i("Server Response Code ", "" + serverResponseCode);        Log.i("Server Response Message", serverResponseMessage);        if (serverResponseCode == 200) {            response = "true";        }        String CDate = null;        Date serverTime = new Date(connection.getDate());        try {            CDate = df.format(serverTime);        } catch (Exception e) {            e.printStackTrace();            Log.e("Date Exception", e.getMessage() + " Parse Exception");        }        Log.i("Server Response Time", CDate + "");        filename = CDate                + filename.substring(filename.lastIndexOf("."),                        filename.length());        Log.i("File Name in Server : ", filename);        fileInputStream.close();        outputStream.flush();        outputStream.close();        outputStream = null;    } catch (Exception ex) {        // Exception handling        response = "error";        Log.e("Send file Exception", ex.getMessage() + "");        ex.printStackTrace();    }    return response;}


if Server accept chunked mode, you can use

((HttpURLConnection) con).setChunkedStreamingMode(chunkLength)

otherwise you can use

((HttpURLConnection) con).setChunkedStreamingMode(0);

or

/* compute first your request content length   contentLength = formBodyLength + yourFileSize*/con.setRequestProperty("Content-Length", String.valueOf(contentLength));((HttpURLConnection) con).setFixedLengthStreamingMode(contentLength);

finally... send what you want


bitmap=Bitmap.createScaledBitmap(bitmap, 100, 100, true);ByteArrayOutputStream stream = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); //compress to format you want.byte [] byte_arr = stream.toByteArray();  String image_str = Base64.encodeBytes(byte_arr);

Best Way I tried it was successful for me!!!