2011-08-26 23 views
1

嗯,我想知道如何實現在分塊模式下發布多部分。我有3個部分,可能很大的文件必須分塊發送。httpClient,在分塊模式下執行多部分POST的問題...

這裏我做什麼:

MultipartEntity multipartEntity = new MultipartEntity() { 
     @Override 
     public boolean isChunked() { 
      return true; 
     } 
    }; 

    multipartEntity.addPart("theText", new StringBody("some text", Charset.forName("UTF-8"))); 

    FileBody fileBody1 = new FileBody(file1); 
    multipartEntity.addPart("theFile1", fileBody1); 

    FileBody fileBody2 = new FileBody(file2); 
    multipartEntity.addPart("theFile2", fileBody2); 

    httppost.setEntity(multipartEntity); 

    HttpParams params = new BasicHttpParams(); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
    HttpClient httpClient = new DefaultHttpClient(params); 

    HttpResponse httpResponse = httpClient.execute(httppost); 

在服務器端,我也收到了3份,但例如文件分塊沒有,他們被接收爲一塊...基本上總我看到4邊界只出現在: - 3xxxx,最後1 --xxx--。 我認爲isChunked的覆蓋會做的伎倆,但沒有...;?(

是什麼,我試圖做是可行的我怎麼能有這樣的工作

非常感謝 的Fab

回答

0

通常,任何體面的服務器端HTTP框架(如Java EE Servlet API)都會隱藏傳輸細節,例如從應用程序代碼中傳輸編碼,因爲您沒有通過從內容流中讀取來看到塊分隔符並不意味着塊編碼未被底層HTTP傳輸使用。

你可以看到究竟什麼樣的HTTP數據包HttpClient的生成由此處所述激活線記錄:

http://hc.apache.org/httpcomponents-client-ga/logging.html

2

要生成一個多體分塊,部分之一,必須有它的尺寸不可用。就像流媒體的一部分。

例如,假設您的file2是一個非常大的視頻。你可以取代你的代碼的一部分:

FileBody fileBody2 = new FileBody(file2); 
multipartEntity.addPart("theFile2", fileBody2); 

wtih代碼:

final InputStreamBody binVideo = new InputStreamBody(new FileInputStream(file2), "video/mp4", file2.getName()); 
multipartEntity.addPart("video", binVideo); 

因爲現在第三部分是一個InputStream,而不是文件,您多HTTP請求將有頭轉移 - 編碼:分塊