摘自今天写的一段代码:
public static int uploadFiles(String fullUrl,Map files,Map params,Map cookies,String encoding) throws IOException {
HttpClient client = new HttpClient();
try {
if(encoding!=null && encoding.length()>0) {
EncodingUtil.TempEncoding=encoding;
}
URL url=new URL(fullUrl);
String host=url.getHost();
String path=url.getPath();
PostMethod post=new PostMethod(fullUrl);
try {
post.setFollowRedirects(false);
List parts=new ArrayList();
if(params!=null) {
for (Map.Entry entry : params.entrySet()) {
String name=entry.getKey();
Object val=entry.getValue();
if(val instanceof Collection) {
for (Object one : (Collection)val) {
parts.add(new StringPart(name,one.toString(),encoding));
}
} else if(val.getClass().isArray()) {
int len = Array.getLength(val);
for(int i=0;i entry : files.entrySet()) {
parts.add(new FilePart(entry.getKey(),entry.getValue()));
}
}
post.setRequestEntity(new MultipartRequestEntity(parts.toArray(new Part[parts.size()]),post.getParams()));
if(cookies!=null) {
HttpState state = client.getState();
if(state==null) {
state=new HttpState();
}
for (Map.Entry entry : cookies.entrySet()) {
Cookie cookie=new Cookie();
cookie.setDomain(host);
cookie.setPath(path);
cookie.setName(entry.getKey());
cookie.setValue(entry.getValue());
state.addCookie(cookie);
}
client.setState(state);
}
return client.executeMethod(post);
} finally {
post.releaseConnection();
}
} finally {
EncodingUtil.TempEncoding=null;
client.getHttpConnectionManager().closeIdleConnections(0);
}
}
一个静态函数,拷贝下来就能用
参数说明:
String fullUrl :上传的地址,全路径,如 http://localhost/doupload.jsp
Map files : 要传的文件,可以是多个
Map params : 同时还可以传递参数,Object 一般是String,也可以是 String[] 或 List
Map cookies : 可能要设置的cookie值
String encoding : 文件名的编码
调用示例:
public void test10() throws Exception {
Map files=new HashMap();
files.put("file1",new File("C:\\Users\\zms\\Desktop\\密保卡.jpg"));
files.put("file2",new File("C:\\Users\\zms\\Desktop\\todo.txt"));
Map params=new HashMap();
params.put("key1","val1");
params.put("key2","值2");
params.put("键3","值3");
Map cookies=new HashMap();
cookies.put("JSESSIONID","BD8BE17C1E56C81DA866643E7125A163");
int status = Tools.uploadFiles("http://localhost/doupload.jsp", files, params, cookies,"GB18030");
System.out.println(status);
}
注意:默认 HttpClient 是无法传中文文件名的
注意代码里的
EncodingUtil.TempEncoding=encoding;
这句是编译不过的,需要修改HttpClient的源代码
我用的版本是HttpClient 3.1,修改 org.apache.commons.httpclient.util.EncodingUtil
大概在 222行,修改 getAsciiBytes 函数,增加 一个静态变量,代码大概如:
public static String TempEncoding="";
/**
* Converts the specified string to byte array of ASCII characters.
*
* @param data the string to be encoded
* @return The string as a byte array.
*
* @since 3.0
*/
public static byte[] getAsciiBytes(final String data) {
if (data == null) {
throw new IllegalArgumentException("Parameter may not be null");
}
try {
return data.getBytes((TempEncoding!=null && TempEncoding.length()>0)?TempEncoding:"US-ASCII");
} catch (UnsupportedEncodingException e) {
throw new HttpClientError("HttpClient requires ASCII support");
}
}
分享到:
相关推荐
它提供了丰富的功能,包括文件上传和下载,支持请求流,以及处理JSON和XML数据。在本例中,我们关注的是HTTPClient 4版本,这是一个稳定且功能强大的版本,适用于多种网络交互场景。 文件上传通常涉及到HTTP的POST...
在这个场景中,我们主要关注如何使用HttpClient进行文件上传。 文件上传通常涉及到Web服务器与客户端之间的交互,比如用户通过网页上传图片或文档到服务器。HttpClient库提供了一个方便的接口来实现这种功能。以下...
3. **HTTPClient文件上传**:在Android中,HTTPClient支持文件上传,这在处理用户上传图片、音频等文件的场景中非常常见。文件上传通常涉及MultipartEntityBuilder,它允许我们将文件作为多部分实体的一部分发送。...
通过上述代码示例,我们可以看到使用Apache HttpClient 4.x版本进行文件上传的过程。关键在于正确构建`MultipartEntity`对象,以及处理好请求和响应过程中可能出现的各种异常情况。同时,需要注意解决中文乱码等问题...
综上所述,HTTPClient和RESTful风格的文件上传下载在Java分布式系统中具有广泛应用。通过HTTPClient实现HTTP请求,利用RESTful接口定义清晰的操作方式,可以构建高效、灵活的文件传输方案。同时,理解并遵循良好的...
2. **MultipartEntityBuilder**:在HttpClient中,用于文件上传的关键类是`MultipartEntityBuilder`。它允许我们将文件作为多部分/form-data类型的数据发送,这是HTTP协议中用于上传文件的标准格式。 3. **文件上传...
服务器端自己写,本示例为客户端代码,可以解决httpClient4乱码问题,是替代修改源码的最佳写法。
总结起来,使用HTTPClient进行文件上传涉及创建POST请求、构建多部分实体、设置字符集,以及正确处理响应。乱码问题通常源于字符集不匹配,需在客户端和服务器端都进行适当的设置。理解这些知识点有助于在实际开发中...
提供的Demo项目可能包含了使用HttpClient发送GET和POST请求的完整示例代码,包括文件上传和乱码处理。通过对这些代码的分析和学习,你可以更好地理解和应用HttpClient进行网络通信。 总的来说,HttpClient是Java...
文件上传过程中可能会遇到各种问题,如网络中断、文件过大、服务器错误等,因此需要编写适当的异常处理代码,确保程序健壮性。 8. **性能优化**: 对于大量文件上传,可以考虑使用异步或者多线程策略,以提高上传...
需要注意的是,由于Android API 23以后HttpClient被弃用,推荐使用`OkHttp`或者`Retrofit`等现代的网络库进行文件上传。但如果你的项目支持较低的Android版本,HttpClient仍然是一个可行的选择。 总结来说,Android...
Struts2、Android和HttpClient是三个关键的技术领域,它们在本次文件上传的场景中相互结合。Struts2是一个流行的Java Web框架,用于构建MVC(模型-视图-控制器)结构的应用程序。Android是Google开发的移动操作系统...
这个库为开发者提供了高级功能,例如异步处理、连接池管理和自定义请求方法,包括POST方式的文件上传。当我们需要通过网络上传头像或者文件时,HTTPClient提供了一个方便的解决方案。以下是关于这个主题的详细知识点...
接下来是文件上传。HttpClient同样支持POST请求来上传文件: 1. 创建HttpPost请求:`HttpPost`对象用于指定接收文件的URL。 2. 添加文件到请求:使用`MultipartEntityBuilder`构建一个多部分实体,添加文件作为...
2. **创建MultipartFormDataContent**:文件上传通常使用多部分形式的数据内容,因此需要创建一个`MultipartFormDataContent`对象,用于封装文件和其他可能的表单数据。 ```csharp MultipartFormDataContent ...
文件上传通常涉及Multipart/form-data格式,可以使用`MultipartEntityBuilder`来构造请求实体: 1. **创建HttpPost请求**:设定目标URL。 2. **构建MultipartEntity**:使用`MultipartEntityBuilder`添加文件和其他...
本教程将深入探讨如何利用Apache的HttpClient库实现文件上传,并且在上传过程中提供进度条接口,以便用户可以直观地看到文件传输的进度。我们将不依赖任何第三方jar包,而是直接对httpmime源码进行改造。 首先,...
以下是使用Apache HttpClient进行文件上传的一个基本步骤: 1. 引入依赖:在项目中添加Apache HttpClient库,如果使用Maven,可以在pom.xml中添加以下依赖: ```xml <groupId>org.apache.httpcomponents ...
本篇文章将详细介绍如何使用Commons HttpClient进行文件上传。 一、Apache Commons HttpClient简介 Apache Commons HttpClient是一个强大的HTTP客户端API,它提供了丰富的功能,如连接管理、重试机制、身份验证等。...