title: Android upload file in chunks to PHP
body: <p>How can we upload big files in chunks to a PHP server so that if the connection dies, the upload can be resumed at any time.</p>
  
  <p>Specifically, what libraries are needed in Android to do this?</p>
  
  <p>The users are uploading big files from countries with slow/unstable internet connections. Thank you</p>
  
  <p>EDIT</p>
  
  <p>More info, I'm currently using HTTP POST to upload the whole file at once. As the following code shows:</p>
  
  <pre><code>private int uploadFiles(File file) {
          String zipName = file.getAbsolutePath() + ".zip";
          if(!zipFiles(file.listFiles(), zipName)){
              //return -1;
              publishResults(-1);
          }
          //publishProgress(-1, 100);
          HttpURLConnection connection = null;
          DataOutputStream outputStream = null;
          DataInputStream inputStream = null;
  
          SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
          String serverUrl = prefs.getString("serverUrl", "ServerGoesHere"); // todo ensure that a valid string is always stored
          String lineEnd = "\r\n";
          String twoHyphens = "--";
          String boundary = "*****";
          int bytesRead, bytesAvailable, bufferSize;
          byte[] buffer;
          int maxBufferSize = 1 * 1024 * 1024;
          int responseCode = -1;
          try {
              //notif title, undeterministic
              pNotif.setContentText("Zipping complete. Now Uploading...")
                    .setProgress(0, 0, true);
              mNotifyManager.notify(NOTIFICATION_ID, pNotif.build()); // make undeterministic
  
              //update progress bar to indeterminate
              sendUpdate(0, 0, "Uploading file."); // sendupdate using intent extras
  
              File uploadFile = new File(zipName);
              long totalBytes = uploadFile.length();
              FileInputStream fileInputStream = new FileInputStream(uploadFile);
  
              URL url = new URL(serverUrl);
              connection = (HttpURLConnection) url.openConnection();
  
              connection.setDoInput(true);
              connection.setDoOutput(true);
              connection.setUseCaches(false);
  
              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);
              outputStream
              .writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""
                      + zipName + "\"" + lineEnd);
              outputStream.writeBytes(lineEnd);
  
              bytesAvailable = fileInputStream.available();
              bufferSize = Math.min(bytesAvailable, maxBufferSize);
              buffer = new byte[bufferSize];
              long bytesUploaded = 0;
              bytesRead = fileInputStream.read(buffer, 0, bufferSize);
  
              while (bytesRead &gt; 0) {
                  bytesUploaded += bytesRead;
                  outputStream.write(buffer, 0, bufferSize);
                  bytesAvailable = fileInputStream.available();
                  bufferSize = Math.min(bytesAvailable, maxBufferSize);
                  bytesRead = fileInputStream.read(buffer, 0, bufferSize);
                  //int percentCompleted = (int) ((100 * bytesUploaded) / totalBytes);
                  //publishProgress((int)bytesUploaded/1024, (int)totalBytes/1024);
  
                  System.out.println("bytesRead&gt; " + bytesRead);
              }
  
              //publishProgress(-2, 1); // switch to clean up
              outputStream.writeBytes(lineEnd);
              outputStream.writeBytes(twoHyphens + boundary + twoHyphens
                      + lineEnd);
              try {
                  responseCode = connection.getResponseCode();
              } catch (Exception e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
              fileInputStream.close();
              outputStream.flush();
              outputStream.close();
              // Delete the zip file
              new File(zipName).delete();
          } catch (Exception ex) {
              new File(zipName).delete();
              responseCode = -1;
              ex.printStackTrace();
          } 
          return responseCode;
      }
  </code></pre>
  
  <p>Is there a way to modify this to send it by chunks? Most of the research I've done has not been very clear, sorry</p>