使用 HttpClient POST 通过上传提交表单
Posted
技术标签:
【中文标题】使用 HttpClient POST 通过上传提交表单【英文标题】:Use HttpClient POST to submit form with upload 【发布时间】:2012-07-17 19:08:34 【问题描述】:我有一个看起来像这样的 html 表单:
<div class="field>
<input id="product_name" name="product[name]" size="30" type="text"/>
</div>
<div class="field>
<input id="product_picture" name="product[picture]" size="30" type="file"/>
</div>
我想编写一个自动创建产品的 Java 模块。这是我已经拥有的:
HttpHost host = new HttpHost("localhost", 3000, "http");
HttpPost httpPost = new HttpPost("/products");
List<BasicNameValuePair> data = new ArrayList<BasicNameValuePair>();
data.add(new BasicNameValuePair("product[name]", "Product1"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(data, "UTF-8");
httpPost.setEntity(entity);
HttpResponse postResponse = httpClient.execute(host, httpPost);
这很好用,它可以创建名为“Product1”的新产品。但我不知道如何处理上传部分。我想要看起来像这样的东西:
data.add(new BasicNameValuePair("product[name]", "Product1"));
但它不是“Product1”,而是一个文件。我阅读了 HttpClient 的文档,据说只有字符串。
有人知道如何处理上传部分吗?
【问题讨论】:
查看***.com/questions/1378920/… 所以解决方案是使用 MultipartEntity 而不是 UrlEncodedFormEntity :-) 【参考方案1】:依赖关系:
<dependency>
<groupid>org.apache.httpcomponents</groupid>
<artifactid>httpclient</artifactid>
<version>4.0.1</version>
</dependency>
<dependency>
<groupid>org.apache.httpcomponents</groupid>
<artifactid>httpmime</artifactid>
<version>4.0.1</version>
</dependency>
代码:[棘手的部分是MultipartEntity的使用]
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1);
HttpPost post = new HttpPost( url );
MultipartEntity entity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE );
// For File parameters
entity.addPart( paramName, new FileBody((( File ) paramValue ), "application/zip" ));
// For usual String parameters
entity.addPart( paramName, new StringBody( paramValue.toString(), "text/plain", Charset.forName( "UTF-8" )));
post.setEntity( entity );
// Here we go!
String response = EntityUtils.toString( client.execute( post ).getEntity(), "UTF-8" );
client.getConnectionManager().shutdown();
【讨论】:
【参考方案2】:另一种处理 HTTP 请求的更快方法是使用curl。
【讨论】:
以上是关于使用 HttpClient POST 通过上传提交表单的主要内容,如果未能解决你的问题,请参考以下文章
httpclient通过post multipart/form-data 上传文件