2012-12-13 63 views
1

這裏是下載功能,我可以使用listener獲取下載進度,我怎樣才能獲得像下載功能一樣的上傳進度。謝謝!如何使用httpClient 4獲取上傳進度?

public void doGetToFile(String url, String localFilePath,CloudStatusListener listener) throws RestHttpException, HttpException { 
    final HttpGet request = new HttpGet(url); 
    final HttpResponse resp; 
    try { 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 

     BasicCredentialsProvider creds= new BasicCredentialsProvider(); 
     creds.setCredentials(new AuthScope(CloudClient.CLOUDHOST,CloudClient.CLOUDPORT),new UsernamePasswordCredentials(UserName,Password)); 
     httpClient.setCredentialsProvider(creds); 


     resp = httpClient.execute(request); 
     long totalnum=resp.getEntity().getContentLength(); 
     if (resp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
      FileOutputStream out = new FileOutputStream(localFilePath); 

      InputStream inputStream=resp.getEntity().getContent(); 

      long bytesRead=0; 
      int bufferSize=listener.progressInterval(); 
      byte b[]=new byte[bufferSize]; 

      int cnt=0; 
      while((cnt=inputStream.read(b))!=-1) 
      { 
       out.write(b,0,cnt); 
       bytesRead+=cnt; 
       listener.onProgress(bytesRead, totalnum); 
      } 
      out.flush(); 
      out.close(); 

      //resp.getEntity().writeTo(out); 

      out.close(); 
      return; 
     } else { 
      final String response = EntityUtils.toString(resp.getEntity()); 
      throw new RestHttpException(resp.getStatusLine().getStatusCode(), response); 
     } 
    } catch (final IOException e) { 
     e.printStackTrace(); 
     throw new HttpException("IOException " + e.toString()); 
    } 
} 

回答

0

我必須解決這個問題,你可以做這樣的:

class FileBodyCounter extends FileBody { 
    private volatile long byteCount; 
    private volatile CloudStatusListener listener; 
    private volatile long totalnum; 

    public FileBodyCounter(File file,CloudStatusListener listener,long totalnum) { 
     super(file); 
     this.listener=listener; 
     this.totalnum=totalnum; 
    } 

    public long getBytesWritten() { 
     return byteCount; 
    } 

    @Override 
    public void writeTo(OutputStream out) throws IOException { 
     super.writeTo(new FilterOutputStream(out) { 
      // 
      // Other write() methods omitted for brevity. 
      // Implement for better performance 
      public void write(int b) throws IOException { 
       byteCount++; 
       super.write(b); 
       if (byteCount % listener.progressInterval() == 0 || 
        byteCount == totalnum){ 
        listener.onProgress(byteCount,totalnum); 
       } 
      } 
     }); 
    } 

} 

POST功能是這樣的:

public String doPostMultipart(String url, 
           String filePath, 
           List<NameValuePair> params, 
           CloudStatusListener listener 
           ) 
           throws RestHttpException, 
             HttpException, 
             IOException { 

    if (params == null) params = EMPTY_PARAMS; 

    HttpPost request = new HttpPost(url); 


    MultipartEntity reqEntity = new MultipartEntity(); 
    if (filePath != null && !filePath.isEmpty()) { 
     FileBody bin = new FileBodyCounter(
            new File(filePath), 
            listener, 
            new FileInputStream(
             new File(filePath) 
             ).available()); 
     reqEntity.addPart("fileUpload", bin); 
    } 

    for (NameValuePair kv : params) { 
     multipartAddKV(reqEntity, kv.getName(), kv.getValue()); 
    } 

    request.setEntity(reqEntity); 

    return execute(request); 
} 
相關問題