【问题标题】:Upload progress bar in android?在android中上传进度条?
【发布时间】:2011-07-03 11:13:51
【问题描述】:

我使用以下代码将视频上传到 php 服务器,它工作正常,但我需要在文件上传时显示进度条,我需要在文件上传和进度条增量之间进行同步。任何人建议有什么想法吗?

      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) 

谢谢。

【问题讨论】:

标签: android android-layout


【解决方案1】:

将您的上传代码放在AsyncTaskdoInBackGround 方法中。然后,您可以从那里publishProgress 并在onProgressUpdate 中更新 ProgressBar。

look herepublishProgress 的外观如何。

【讨论】:

    【解决方案2】:

    我想您是在问如何获得当前上传进度的数字表示,以便您可以将该值显示为进度条。使用您当前的代码,我不确定您是否可以轻松做到。您尝试上传的最大文件是多少?我想你会得到一个OutOfMemory 大文件的错误。你这样做:

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

    您的“缓冲区”只是一个与整个文件大小相同的数组。对fileInputStream.read() 的调用可能会尝试将文件的全部内容放入“缓冲区”。如果您的文件很大(超过几十兆字节),那么您的应用可能会因OutOfMemory 错误而崩溃。

    如果您使用固定大小的小缓冲区,那么每次通过while 循环,您都可以计算您已经发送的数据量,将其转换为百分比值,然后调用publishProgess 以获得@ 987654327@ 或 sendMessage Handler

    【讨论】:

    • 但是这个进度不是上传文件的进度。它是文件写入缓冲区的进度。对吧?
    • @MuhammadRiyaz 这取决于循环中的调用顺序。如果写入输出流,然后计算并发布进度,那么就是上传的数据量。如果您交换订单,则它是已读取的数据量。实际上,缓冲区通常比要上传的数据量小得多,因此对用户没有影响。
    【解决方案3】:

    如果您想要更细粒度的控制,也可以使用带有处理程序的线程,但对于大多数任务,AFAIK AsyncTask 应该可以工作。

    【讨论】:

      【解决方案4】:
      connection.setFixedLengthStreamingMode((int) requestLength);
      

      帮我搞定了!

      【讨论】:

      • 你能告诉我在这种情况下什么是 requestLength 吗?怎么获得?
      • 请同时添加请求长度描述。
      • @user5155835 int requestLength = sourceFile.length();
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多