2015-03-30 76 views
3

我有一個HTML表單,其中有一個文件上傳。我試圖通過使用MultipartEntityBuilder的表單上傳Word文檔,但它不起作用。Apache HttpClient POST上傳文件不會與MultipartEntityBuilder上傳

表單中有幾個文本輸入和2個文件上傳行。如果我使用BasicNameValuePair方法並將這些字段設置爲空字符串,則文本字段會正確提交。由於我需要上傳文件,因此我更改爲MultipartEntityBuilder,甚至無法再次進行基本測試。

工作守則

HttpClient client = HttpClientBuilder.create().build(); 
String uploadUrl = "http://somepage.com/upload"; 

HttpPost httppost = new HttpPost(uploadUrl); 

httppost.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); 
httppost.setHeader("Content-Type", "multipart/form-data"); 
httppost.setHeader("Accept-Encoding", "gzip, deflate"); 

List<NameValuePair> formparams = new ArrayList<NameValuePair>(); 

formparams.add(new BasicNameValuePair("testField1", "Value1")); 
formparams.add(new BasicNameValuePair("testField2", "Value2")); 
formparams.add(new BasicNameValuePair("fileField1", "")); 
formparams.add(new BasicNameValuePair("fileField2", "")); 

httppost.setEntity(new UrlEncodedFormEntity(formparams, Consts.UTF_8)); 

HttpResponse response = client.execute(httppost, httpContext); 

試圖MultipartEntityBuilder

// Everything up to and including the Headers remain the same 

MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 

StringBody sb = new StringBody("Value1", ContentType.TEXT_PLAIN); 
builder.addPart("textField1", sb); 

sb = new StringBody("Value2", ContentType.TEXT_PLAIN); 
builder.addPart("textField2", sb); 

FileBody fb = new FileBody(new File("path to file"), ContentType.DEFAULT_BINARY); 
builder.addPart("fileField1", fb); 

fb = new FileBody(new Field("path to file2"), ContentType.DEFAULT_BINARY); 
builder.addPart("fileField2", fb); 

httppost.setEntity(builder.build()); 

HttpResponse response = client.execute(httppost, httpContext); 

形式是由Oracle託管,並取回錯誤:

An unexpected error occurred: ORA-06501: PL/SQL: program error

我有也嘗試過這些其他的方法:

builder.addTextBody("textField1", "Value1"); 
builder.addTextBody("textField2", "Value2"); 

File file1 = new File("path to file1"); 
builder.addBinaryBody("fileField1", file1, ContentType.DEFAULT_BINARY, file1.getName()); 

File file2 = new File("path to file2"); 
builder.addBinaryBody("fileField2", file2, ContentType.DEFAULT_BINARY, file2.getName()); 

除了試圖通過把一切在builder.addTextBody()像我原來的工作測試,模仿我的第一次測試,但仍得到相同的結果。

記錄

按@oleg要求,我已經發布了線數從這個函數:

DEBUG [org.apache.http.client.protocol.RequestAddCookies] CookieSpec selected: default 
DEBUG [org.apache.http.client.protocol.RequestAddCookies] Cookie [version: 0][name: SSO_TIMEOUT_ID][value: v1.0~83BA4EF3DA76C07B55F93B5C5D65F90947314693035F046BFCC21BCD37F8B95284E732E711971532B182F90AE461E320FCCC74452BAF4A16FB6E5EFA5F86985B26C95D30001D9ACC3BE8E9D2786B1CD38A79788FC7623FCE06C84266C234638182D44786E4971B53EBFC25FD3B7A565F][domain: isomething.com][path: /][expiry: null] match [wwwdev.isomething.com:80/portal/pls/cust_portal/!CUST_PORTAL.wwa_app_module.accept] 
DEBUG [org.apache.http.client.protocol.RequestAddCookies] Cookie [version: 0][name: cust_portal][value: 9.0.3+en-us+us+AMERICA+12955AE0CEA20F3CE050558C15F00BD2+84676D40A18761D45DEBA039A78FF868CA9B49F2DEA2D283DE61561CE0F547D3A27C643219F1E6C867CF150CDEA69AE9844407F570B4BBD967491098CECEEA836861C9FF1F06AF7929814DF3C55426F1C2E73C91B219801B][domain: wwwdev.isomething.com][path: /][expiry: null] match [wwwdev.isomething.com:80/portal/pls/cust_portal/!CUST_PORTAL.wwa_app_module.accept] 
DEBUG [org.apache.http.client.protocol.RequestAuthCache] Auth cache not set in the context 
DEBUG [org.apache.http.impl.conn.PoolingHttpClientConnectionManager] Connection request: [route: {}->http://wwwdev.isomething.com:80][total kept alive: 0; route allocated: 0 of 2; total allocated: 0 of 20] 
DEBUG [org.apache.http.impl.conn.PoolingHttpClientConnectionManager] Connection leased: [id: 4][route: {}->http://wwwdev.isomething.com:80][total kept alive: 0; route allocated: 1 of 2; total allocated: 1 of 20] 
DEBUG [org.apache.http.impl.execchain.MainClientExec] Opening connection {}->http://wwwdev.isomething.com:80 
DEBUG [org.apache.http.impl.conn.DefaultHttpClientConnectionOperator] Connecting to wwwdev.isomething.com/141.146.161.39:80 
DEBUG [org.apache.http.impl.conn.DefaultHttpClientConnectionOperator] Connection established 10.0.0.2:49827<->141.146.161.39:80 
DEBUG [org.apache.http.impl.execchain.MainClientExec] Executing request POST /portal/pls/cust_portal/!CUST_PORTAL.wwa_app_module.accept HTTP/1.1 
DEBUG [org.apache.http.impl.execchain.MainClientExec] Target auth state: UNCHALLENGED 
DEBUG [org.apache.http.impl.execchain.MainClientExec] Proxy auth state: UNCHALLENGED 
DEBUG [org.apache.http.headers] http-outgoing-4 >> POST /portal/pls/cust_portal/!CUST_PORTAL.wwa_app_module.accept HTTP/1.1 
DEBUG [org.apache.http.headers] http-outgoing-4 >> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
DEBUG [org.apache.http.headers] http-outgoing-4 >> Origin: http://wwwdev.isomething.com 
DEBUG [org.apache.http.headers] http-outgoing-4 >> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.104 Safari/537.36 
DEBUG [org.apache.http.headers] http-outgoing-4 >> Referer: http://wwwdev.isomething.com/portal/page/cust_portal/SOM_PGR/ReportManager2/ReportManager/SOM_Reports_MTC/SOM_FILE_CLERK_ADD_REPORT?np_report_number=MTC&np_project_number=3141307&np_country=US&np_customer_number=110960&np_module=URM&np_customer_name=MY TEST CENTRAL TEST ACCOUNT 
DEBUG [org.apache.http.headers] http-outgoing-4 >> Accept-Encoding: gzip, deflate 
DEBUG [org.apache.http.headers] http-outgoing-4 >> Accept-Language: en-US,en;q=0.8 
DEBUG [org.apache.http.headers] http-outgoing-4 >> DNT: 1 
DEBUG [org.apache.http.headers] http-outgoing-4 >> Content-Length: 49234 
DEBUG [org.apache.http.headers] http-outgoing-4 >> Content-Type: multipart/form-data; boundary=_I6HZ69Fquh0RHe-DNWGs9tfX48pemmkOYs 
DEBUG [org.apache.http.headers] http-outgoing-4 >> Host: wwwdev.isomething.com 
DEBUG [org.apache.http.headers] http-outgoing-4 >> Connection: Keep-Alive 
DEBUG [org.apache.http.headers] http-outgoing-4 >> Cookie: SSO_TIMEOUT_ID=v1.0~83BA4EF3DA76C07B55F93B5C5D65F90947314693035F046BFCC21BCD37F8B95284E732E711971532B182F90AE461E320FCCC74452BAF4A16FB6E5EFA5F86985B26C95D30001D9ACC3BE8E9D2786B1CD38A79788FC7623FCE06C84266C234638182D44786E4971B53EBFC25FD3B7A565F; cust_portal=9.0.3+en-us+us+AMERICA+12955AE0CEA20F3CE050558C15F00BD2+84676D40A18761D45DEBA039A78FF868CA9B49F2DEA2D283DE61561CE0F547D3A27C643219F1E6C867CF150CDEA69AE9844407F570B4BBD967491098CECEEA836861C9FF1F06AF7929814DF3C55426F1C2E73C91B219801B 
DEBUG [org.apache.http.headers] http-outgoing-4 << HTTP/1.1 200 OK 
DEBUG [org.apache.http.headers] http-outgoing-4 << Cache-Control: max-age=0 
DEBUG [org.apache.http.headers] http-outgoing-4 << Content-Type: text/html; charset=UTF-8 
DEBUG [org.apache.http.headers] http-outgoing-4 << Set-Cookie: SSO_TIMEOUT_ID=v1.0~83BA4EF3DA76C07B68FCC2530F599A0EC0C64F824C7AE3F72C95A8D07625F4915248DB9B7D40E28DF645BB373ADAE5E39B2A539F98F48507192E9993DAFEDE4D30331E7912A944E0A9C203BD851C0C0D7DCBC672186F9DF652220BC26B85C327A81DE6656E5D73550FCD2EA1BA53552F; domain=.isomething.com; path=/ 
DEBUG [org.apache.http.headers] http-outgoing-4 << Connection: Keep-Alive 
DEBUG [org.apache.http.headers] http-outgoing-4 << Keep-Alive: timeout=5, max=999 
DEBUG [org.apache.http.headers] http-outgoing-4 << Server: Oracle-Application-Server-10g/10.1.2.3.0 Oracle-HTTP-Server OracleAS-Web-Cache-10g/10.1.2.3.2 (N;ecid=100569954162,0) 
DEBUG [org.apache.http.headers] http-outgoing-4 << Content-Length: 5134 
DEBUG [org.apache.http.headers] http-outgoing-4 << Date: Tue, 31 Mar 2015 13:06:53 GMT 
DEBUG [org.apache.http.headers] http-outgoing-4 << Content-Location: /servlet/RepositoryServlet/cust_portal/!CUST_PORTAL.wwa_app_module.accept 
DEBUG [org.apache.http.impl.execchain.MainClientExec] Connection can be kept alive for 5000 MILLISECONDS 
DEBUG [org.apache.http.client.protocol.ResponseProcessCookies] Cookie accepted [SSO_TIMEOUT_ID="v1.0~83BA4EF3DA76C07B68FCC2530F599A0EC0C64F824C7AE3F72C95A8D07625F4915248DB9B7D40E28DF645BB373ADAE5E...", version:0, domain:isomething.com, path:/, expiry:null] 

回答

7

前段時間,我花了很多時間試圖提交多形式的文件。最後問題通過添加邊界來解決。據我瞭解,一些調試服務器無法識別沒有它的部件。

String boundary = "---------------"+UUID.randomUUID().toString(); 
multipartEntityBuilder.setBoundary(boundary); 
... 
HttpPost request = new HttpPost(uriBuilder.build()); 
request.setHeader("Content-Type", ContentType.MULTIPART_FORM_DATA.getMimeType()+";boundary="+boundary); 
... 
multipartEntityBuilder.addBinaryBody("document[file]", dataBytes, ContentType.APPLICATION_OCTET_STREAM, name); 
+1

默認情況下,HttpClient根據封裝的請求實體的屬性生成正確的Content-Type頭。通常不需要在請求消息上設置Content-Type頭。 – oleg 2015-03-31 08:15:04

+1

之所以這樣做,是因爲它沒有被HttpClient添加,因此將邊界參數添加到標題值。 – Stan 2015-03-31 08:18:05

+0

這是錯誤的。邊界元素由HttpClient自動填充 – oleg 2015-03-31 08:23:24

2

嘗試刪除這條線

httppost.setHeader("Content-Type", "multipart/form-data"); 

更新

預期應用程序發送無效的Content-Type頭

[org.apache.http.headers] http-outgoing-5 >> Content-Type: multipart/form-data 

請不要手動設置Content-Type和讓HttpClient創根據請求中包含的HttpEntity的屬性對您進行打包

+0

這沒有做任何不同 – Ascalonian 2015-03-31 12:04:58

+0

帖子Wirelog:http://hc.apache.org/httpcomponents-client-4.4.x/logging.html – oleg 2015-03-31 12:11:15

+0

添加到問題:-) – Ascalonian 2015-03-31 12:30:16