开发者

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 +开发者_JS百科 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 .


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.


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.


Or you can use a Thread with an Handler if you want finer grained control though for most tasks AFAIK AsyncTask should work.


connection.setFixedLengthStreamingMode((int) requestLength);

did the trick for me !

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜