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 !
精彩评论