0

I want to split the image in the chunks for 4mb each and then upload to server.How can I achieve this for sending an image in multipart.

I have tried some way but I am getting media not supported error.

            FileInputStream fileInputStream = new FileInputStream(selectedFile);
            URL url = new URL("SERVER_URL");
            connection = (HttpURLConnection) url.openConnection();

            connection.setDoInput(true);//Allow Inputs
            connection.setDoOutput(true);//Allow Outputs
            connection.setUseCaches(false);//Don't use a cached Copy
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Connection", "Keep-Alive");
            connection.setRequestProperty("ENCTYPE", "multipart/form-data");
            connection.setRequestProperty(
                    "Content-Type", "multipart/form-data;boundary=" + boundary);
            connection.setRequestProperty("uploaded_file",selectedFilePath);

I want the input in following way.

    {
              "blocks": [{
                    "hashdata": "dsfhsdfjhjsdfhj36278dhgjgddfsh7k",
                    "data": <base64 data>
                },{
                    "hashdata": "abcdskjfkskdfh8772384374789327dh",
                    "data": <base64 data>
                }]
     }
Paul P Joby
  • 713
  • 7
  • 17
bmm
  • 3
  • 1
  • 4

1 Answers1

2

The best and simple way is to read the files as bytes into to a byte array and the divide it into whatever size you want and then upload to the server. This method can be used for dividing any type of file no matter if its an image or text or even binary file.

Make Sure you don't do this on you UI Thread

      final int MAX_SUB_SIZE = 4194304; // 4*1024*1024 == 4MB
      FileInputStream f = new FileInputStream("pathto/img.png");
      byte[] data = new byte[f.available()];  // Size of original file
      byte[] subData = new byte[MAX_SUB_SIZE];  // 4MB Sized Array

      f.read(data); // Read The Data
      int start = 0;  // From 0
      int end = MAX_SUB_SIZE;    // To MAX_SUB_SIZE bytes
      // Just Saving the size to avoid re-computation
      int max = data.length;
      if(max > 0)
      {

           for( ;end < max; ){
             subData = Arrays.copyOfRange(data, start, end);
             start = end;
             end = end + MAX_SUB_SIZE;
             if(end >= max)
             {
                end = max;
             }

             upload4MB(subData); // This is your method to upload data
           }
           // For the Last Chunk (size less than or equal to 4mb)
           end--; // To avoid a padded zero
           subData = Arrays.copyOfRange(data, start, end);
           upload4MB(subData);
         }

NOTE

    /*This method used in the abouve code is your
      logic for uploading the file to sever */

      upload4MB(byte[] chunk) 

    /*Either save the chunks to upload it together
     or upload the chunk then and there itself*/

Put all these in try-catch to capture any kind of exception that may occur.

"subData" byte array corresponds to your 4mb chunk of data do whatever you wish to do with the chunk.

Also refer this post so as to get an idea how to upload file to server using Android and PHP as backend.

Read this Post on StackOverflow that shows how to upload files

Hope this solves your issue. Please don't forget you approve if it was useful.

Paul P Joby
  • 713
  • 7
  • 17
  • try reading this to get to know how to upload files with volley to your server. https://www.simplifiedcoding.net/upload-image-to-server/ – Paul P Joby Jul 30 '19 at 07:32
  • i have shown how to divide data into parts as asked .. please do upvote and approve the answer.. its so discouraging when we do lot of hardwork answering the question but its not approved – Paul P Joby Jul 30 '19 at 07:33
  • Thanks for your help once again. I can now split the images successfully. – bmm Aug 02 '19 at 04:59
  • @bmm the please do upvote if it was helpful ... You are always welcome :) – Paul P Joby Aug 02 '19 at 05:48