2011-02-24 23 views
10

Utilizo el siguiente código para subir el video al servidor php, funcionaba bien, pero necesito mostrar la barra de progreso mientras se carga el archivo, necesito sincronizar entre la carga de archivos y el incremento de la barra de progreso. Alguien sugiere alguna ¿idea?Subir la barra de progreso en Android?

 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) 

Gracias.

+0

Compruebe la siguiente respuesta, que puede ayudar: [http://stackoverflow.com/questions/15572747/progressbar-in-asynctask-is-not-showing-on-upload][1] [1]: http://stackoverflow.com/a/19295719/463846 – Mousa

+0

¿Cómo se pueden enviar datos adicionales, como una cadena, con estos datos multiparte? – user5155835

Respuesta

7

Ponga su código de carga en el método doInBackGround de AsyncTask. Puede entonces publishProgress desde allí y en onProgressUpdate actualizar ProgressBar.

Tenga look here en cómo esto puede verse con publishProgress.

0

O puede utilizar un subproceso con un controlador si desea un control más detallado, aunque para la mayoría de las tareas AFAIK AsyncTask debería funcionar.

1

Creo que está preguntando cómo puede obtener una representación numérica del progreso de carga actual para que pueda mostrar ese valor como una barra de progreso. Con tu código actual, no estoy seguro de que puedas hacerlo fácilmente. ¿Cuál es el archivo más grande que has intentado cargar? Creo que obtendrá un error OutOfMemory con archivos grandes. Haga esto:

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

Su "buffer" es simplemente una matriz que tiene el mismo tamaño que su archivo completo. La llamada al fileInputStream.read() podría intentar poner el contenido completo del archivo en el "buffer". Si su archivo es grande (más de algunas decenas de megabytes), su aplicación puede bloquearse con un error OutOfMemory.

Si se utiliza un pequeño búfer de tamaño fijo, entonces cada vez a través del bucle while se puede calcular la cantidad de datos que ya ha enviado, convertir esto en un valor porcentual y, o bien llamar publishProgess para una AsyncTask o sendMessage de a Handler.

+0

¿Puede ayudar a resolver el error de outofmemory? – brian

+0

Pero este progreso no es el progreso del archivo que se está cargando. Es el progreso del archivo que se escribe en el búfer. Correcto ? –

+0

@MuhammadRiyaz dependerá del orden de las llamadas en su ciclo. Si escribe en el flujo de salida, luego calcula y publica el progreso, entonces es la cantidad de datos cargados. Si intercambias el pedido, es la cantidad de datos que se ha leído. En la práctica, el búfer suele ser mucho más pequeño que la cantidad de datos que se cargarán, por lo que no haría ninguna diferencia para el usuario. –

-1
connection.setFixedLengthStreamingMode((int) requestLength); 

hizo el truco para mí!

+0

¿Puede decirnos cuál es la duración de la solicitud en este caso? ¿Cómo puedes obtenerlo? – user5155835

+0

por favor agregue la descripción de requestlength también. – NehaK

+0

@ user5155835 'int requestLength = sourceFile.length();' – Zurechtweiser

Cuestiones relacionadas