2012-02-28 71 views
2

我使用Apache HttpComponents'HttpClient將文件上傳到第三方Web界面。代碼如下所示:實際上不使用文件的HTTP文件上傳

HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("UPLOAD_URL"); 
FileBody bin = new FileBody(file, filename, "text/csv", "UTF-8"); 
MultipartEntity reqEntity = new MultipartEntity(); 
reqEntity.addPart("Username", new StringBody("User")); 
reqEntity.addPart("Password", new StringBody("Password")); 
reqEntity.addPart("bin", bin); 
httppost.setEntity(reqEntity); 
HttpResponse response = httpclient.execute(httppost); 

這是按預期工作。

由於此數據很敏感,我不希望它存儲在客戶端。 (該程序從Web服務中檢索這些數據,我只創建了用於上傳文件的文件)。

所以我正在尋找一種不使用真實文件的方法,而是將其替換爲某種內存中的表示。我嘗試使用InputStreamBody代替,但這些請求被第三方系統拒絕。

任何想法如何做到這一點?

+1

所以,你的應用程序中,作爲客戶端,從web服務,並上傳到你的服務器獲取文件,像個代理...,但你不希望您的應用能夠訪問所述文件?我會說你在這裏問的是錯誤的問題,因爲無論你在哪裏存儲它 - 內存中或文件 - 客戶端*將*都可以訪問它...... – Marcelo 2012-02-28 09:18:32

+0

是的,但這可能仍然是一個有效的要求 - 如果你信任用戶但不希望敏感的個人數據在磁盤上。 – DNA 2012-02-28 09:25:31

+0

我們的網絡服務*不是*返回一個文件,該文件是由客戶端應用程序創建的,僅用於上傳文件。客戶端應用程序可以訪問這些數據,但我不希望它在客戶機上作爲文件存儲。客戶在上傳數據後立即刪除數據,但可能會出現這種情況。在這種情況下,數據將保留在客戶機上供任何人訪問。 – TPete 2012-02-28 09:31:48

回答

2

貌似問題使用InputStreamBodygetContentLength方法,它看起來像這樣:

public long getContentLength() { 
    return -1; 
} 

這導致分塊 HTTP POST(Transfer-Encoding: chunked),這似乎是不被該特定的理解網頁界面。所以,我結束了延長InputStreamBody這樣的:

public class NoFileBody extends InputStreamBody { 

    private final long length; 

    public NoFileBody(final InputStream in, final String mimeType, final String filename, final long length) { 
    super(in, mimeType, filename); 
    this.length = length; 
    } 

    @Override 
    public long getContentLength() { 
    return length; 
    } 

} 
0

查看MultipartEntity:addPart方法將String和ContentBody作爲參數。 ContentBody似乎是一個易於實現的接口(FileBody實現它)。您基本上必須編寫writeTo(OutputStream)方法,將您的數據輸出到OutputStream。

+0

這就是爲什麼我嘗試'InputStreamBody',沒有任何運氣。現在嘗試一個自定義的實現。 – TPete 2012-02-28 09:38:59

+0

如果我是你,我會將它基於FileBody,這是少於150行代碼(包括評論)!我已編輯帖子以顯示如何 – Eduardo 2012-02-28 09:42:12

+0

你不能這樣做:'writeTo'是接口'ContentBody'中定義的方法,所以你不能只改變它的簽名。 – TPete 2012-02-28 11:06:07