Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Upload progress bar in android?

I use the following code to upload the Video to php server, it was working fine, but i need to show the progress bar while file being uploaded, i need to made the synchronization between file upload and progress bar increment.Anyone suggest some idea?

      HttpURLConnection conn = null;
      DataOutputStream dos = null;
      DataInputStream inStream = null;
      String lineEnd = "\r\n";
      String twoHyphens = "--";
      String boundary = "*****";
      int bytesRead, bytesAvailable, bufferSize;
      byte[] buffer;
      int maxBufferSize = 1 * 1024 * 1024;
      String responseFromServer = "";

      File sourceFile = new File(sourceFileUri);
      if (!sourceFile.isFile()) {
       Log.e("Huzza", "Source File Does not exist");
       return;
      }
      int serverResponseCode=0;
    try { // open a URL connection to the Servlet
       FileInputStream fileInputStream = new FileInputStream(sourceFile);
       URL url = new URL(upLoadServerUri);
       conn = (HttpURLConnection) url.openConnection(); // Open a HTTP  connection to  the URL
       conn.setDoInput(true); // Allow Inputs
       conn.setDoOutput(true); // Allow Outputs
       conn.setUseCaches(false); // Don't use a Cached Copy
       conn.setRequestMethod("POST");
       conn.setRequestProperty("Connection", "Keep-Alive");
       conn.setRequestProperty("ENCTYPE", "multipart/form-data");
       conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
       conn.setRequestProperty("uploadedfile", fileName);

      // conn.setFixedLengthStreamingMode(1024);
       //conn.setChunkedStreamingMode(1);
       dos = new DataOutputStream(conn.getOutputStream());

       dos.writeBytes(twoHyphens + boundary + lineEnd);
       dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""+ fileName + "\"" + lineEnd);
       dos.writeBytes(lineEnd);

       bytesAvailable = fileInputStream.available(); // create a buffer of  maximum size
       Log.i("Huzza", "Initial .available : " + bytesAvailable);

       //bufferSize = Math.min(bytesAvailable, maxBufferSize);
       bufferSize=(int)sourceFile.length();


       System.out.println("BytesAvail"+bytesAvailable);
       System.out.println("maxBufferSize"+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(twoHyphens + boundary + twoHyphens + lineEnd);

       // Responses from the server (code and message)
       serverResponseCode = conn.getResponseCode();
       String serverResponseMessage = conn.getResponseMessage();

       Log.i("Upload file to server", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode);
       // close streams
       Log.i("Upload file to server", fileName + " File is written");
       fileInputStream.close();
       dos.flush();
       dos.close();
      } catch (MalformedURLException ex) {
       ex.printStackTrace();
       Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
      } catch (Exception e) {
       e.printStackTrace();
      }
    //this block will give the response of upload link
      try {
       BufferedReader rd = new BufferedReader(new InputStreamReader(conn
         .getInputStream()));
       String line;
       while ((line = rd.readLine()) != null) {
        Log.i("Huzza", "RES Message: " + line);
       }
       rd.close();
      } catch (IOException ioex) {
       Log.e("Huzza", "error: " + ioex.getMessage(), ioex);
      }
      return;  // like 200 (Ok) 

Thanks .

like image 734
Karthi Avatar asked Feb 24 '11 10:02

Karthi


People also ask

What is progress bar in Android?

Android ProgressBar is a graphical view indicator that shows some progress. Android progress bar displays a bar representing the completing of the task. Progress bar in android is useful since it gives the user an idea of time to finish its task.


2 Answers

Put your upload code in the doInBackGround method of an AsyncTask. You can then publishProgress from there and in onProgressUpdate update the ProgressBar.

Have a look here on how this may look with publishProgress.

like image 181
Heiko Rupp Avatar answered Nov 13 '22 18:11

Heiko Rupp


I think you are asking how you can get a numerical representation of the current upload progress so that you can show that value as a progress bar. With your current code, I'm not sure that you easily can. What is the largest file you have attempted to upload? I think you will get an OutOfMemory error with big files. You do this:

byte[] buffer;
bufferSize=(int)sourceFile.length();
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
...

Your "buffer" is just an array that is the same size as your whole file. The call to fileInputStream.read() could attempt to put the full content of the file into the "buffer". If your file is large (more than a few tens of megabytes) then your app can crash with an OutOfMemory error.

If you use a small buffer of a fixed size, then every time through the while loop you can calculate the amount of data you have already sent, convert this to a percentage value and either call publishProgess for an AsyncTask or sendMessage for a Handler.

like image 45
dave.c Avatar answered Nov 13 '22 18:11

dave.c