2016-07-30 106 views
0

我想編寫Java代碼做的正是這個命令的作用:相當於Java用圖片和文字捲曲POST請求的

curl -F "[email protected]" -F "param1=some-value" -F "param2=some_value" http://example.com 

我目前想是這樣的:

HttpClient httpClient = HttpClientBuilder.create().build(); 
HttpPost poster = new HttpPost("http://example.com"); 
MultipartEntityBuilder mpEntityBuilder = MultipartEntityBuilder.create(); 
mpEntityBuilder.addPart("param1", new StringBody("some-value")); 
mpEntityBuilder.addPart("param2", new StringBody("some-value")); 
mpEntity.addPart("image", getImage("some-image")); 
poster.setEntity(mpEntityBuilder .build()); 
HttpResponse response = httpClient.execute(poster); 

here getImage(String)返回一個ByteArrayBody。 (實際上,我從下載的飛行網路上的圖片,而不是像從curl命令磁盤讀取,但我不認爲這應該有所作爲)

我檢查了這個鏈接,但它不」牛逼確切地址在你發送兩個圖像以及文本參數的情況: Java Equivalent of curl query

什麼奇怪的是,我使用幾乎相同的代碼,使一個HTTP POST來時,我需要工作正常另一個API單獨發送圖像而沒有任何文本參數。 (無stringbody)

但是,當我試圖同時發送的圖像(作爲ByteArrayBody)和一些文字(如StringBody),我從服務器獲取說像一個神祕的錯誤消息: 「無法使用mimeType初始化參數對象:application/octet-stream'。這可能是一個自定義的錯誤信息,所以我不能在這方面找到很多信息。

我嘗試使用StringBody()的一些其他構造函數,因爲這個不推薦使用,但它沒有幫助。不知道什麼是正確的構造函數使用,但不知道這是否會導致問題。

編輯:好像某人的問過一個非常類似的問題,但解決方案並不爲我工作: Android: upload file with filling out POST body together 我得到一個錯誤信息有關 失敗參數初始化與mime類型:應用程序/八位字節流)

+0

我相信你會需要Base64對圖像進行編碼。看看http://stackoverflow.com/questions/5416038/uploading-image-to-server-in-multipart-along-with-json-data-in-android – GreyBeardedGeek

+0

謝謝,我會檢查出來。但是這並不能解釋爲什麼上面的代碼可以很好地執行這個curl命令: curl -F「file」=「@ example.png」「https://example.com」 – kerouac

回答

1

我沒有看到它的記錄,但curl -F @顯然試圖幫助填充Content-type對於一些擴展/後綴,包括image/jpeg.jpg。 HttpClient不會,並默認一切到MIME'我不知道'類型application/octet-stream這可能導致你的錯誤。 使用3 - 精氨酸ctor的,設置內容類型

new ByteArrayBody (data, ContentType.create("image/jpeg"), null) 

或者如果要指定文件名的屬性,它curl -F @也做,但Web服務器(不同的瀏覽器)通常不關心,請提供String代替null第三個參數。

+0

你是個天才!我到處尋找後放棄了。 – kerouac