0

I am working on android application. I have to upload file on server. if I am using file size less than 4 mb it is uploading it successful . if i am using file size greater than it showing out of memory exception. Please help me. my code is given below.

HttpURLConnection conn = null;
    DataOutputStream dos = null;
    DataInputStream inStream = null;
    String existingFileName = Environment.getExternalStorageDirectory()
             + "/LoadImg/second.flv";;
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1*1024*1024;
    String responseFromServer = "";
    String urlString = "http://172.16.1.193/service.svc/UploadFile?filename=test.mp4";

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
            .permitAll().build();

    StrictMode.setThreadPolicy(policy);
    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);
        // 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);
        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(lineEnd);
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        // close streams
        Log.e("Debug", "File is written");
        fileInputStream.close();
        dos.flush();
        dos.close();

    } catch (MalformedURLException ex) {
        System.out.println("upload MalformedURLException >>>> "
                + ex.toString());
    } catch (IOException ioe) {
        System.out.println("upload IOException >>>> " + ioe.toString());
    }

    // ------------------ read the SERVER RESPONSE
    try {

        inStream = new DataInputStream(conn.getInputStream());
        String str;

        while ((str = inStream.readLine()) != null) {
            System.out.println("Server response >>>> " + str);
        }

        inStream.close();

    } catch (IOException ioex) {
        System.out.println("inStream exception >>>> "
                + ioex.getMessage().toString());
    }
Nitesh Kabra
  • 265
  • 1
  • 3
  • 7
  • look into this sample http://vikaskanani.wordpress.com/2011/01/11/android-upload-image-or-file-using-http-post-multi-part/ – Mr Nice Jan 07 '14 at 13:17

2 Answers2

0

did you put your download video code in asynctask. StrictMode is turned on by default in Honeycomb. Android Honeycomb: NetworkOnMainThreadException even when using AsyncTask and no strict mode?

Community
  • 1
  • 1
mcd
  • 1,434
  • 15
  • 31
0

It looks like that the error is caused because you did not use the streaming mode and read the file completely before sending out the first byte to server.

you can fix this issue by using setChunkedStreamingMode() API to enable streaming mode of sending file, below is the code sample.

        // set the request mode as POST
        urlConnection.setRequestMethod("POST");

        // disable using cache.
        urlConnection.setUseCaches(false);

        // enable Output/Input.
        urlConnection.setDoOutput(true);
        urlConnection.setDoInput(true);

        // enable the streaming mode.
        urlConnection.setChunkedStreamingMode(128 * 1024);

        urlConnection.setRequestProperty("Connection", "Keep-Alive");
        urlConnection.setRequestProperty("Cache-Control", "no-cache");
Zephyr
  • 6,123
  • 34
  • 33