`

HttpClient文件上传代码

阅读更多
摘自今天写的一段代码:

    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");
        }
    }
分享到:
评论

相关推荐

    httpclient 文件上传 下载

    它提供了丰富的功能,包括文件上传和下载,支持请求流,以及处理JSON和XML数据。在本例中,我们关注的是HTTPClient 4版本,这是一个稳定且功能强大的版本,适用于多种网络交互场景。 文件上传通常涉及到HTTP的POST...

    HttpClient 文件上传

    在这个场景中,我们主要关注如何使用HttpClient进行文件上传。 文件上传通常涉及到Web服务器与客户端之间的交互,比如用户通过网页上传图片或文档到服务器。HttpClient库提供了一个方便的接口来实现这种功能。以下...

    android httpclient文件上传 http协议post get方法向服务器传输数据

    3. **HTTPClient文件上传**:在Android中,HTTPClient支持文件上传,这在处理用户上传图片、音频等文件的场景中非常常见。文件上传通常涉及MultipartEntityBuilder,它允许我们将文件作为多部分实体的一部分发送。...

    HttpClient 4文件上传

    通过上述代码示例,我们可以看到使用Apache HttpClient 4.x版本进行文件上传的过程。关键在于正确构建`MultipartEntity`对象,以及处理好请求和响应过程中可能出现的各种异常情况。同时,需要注意解决中文乱码等问题...

    httpclient和RestfuL风格上传下载文件

    综上所述,HTTPClient和RESTful风格的文件上传下载在Java分布式系统中具有广泛应用。通过HTTPClient实现HTTP请求,利用RESTful接口定义清晰的操作方式,可以构建高效、灵活的文件传输方案。同时,理解并遵循良好的...

    使用HttpClient实现文件的上传所需lib

    2. **MultipartEntityBuilder**:在HttpClient中,用于文件上传的关键类是`MultipartEntityBuilder`。它允许我们将文件作为多部分/form-data类型的数据发送,这是HTTP协议中用于上传文件的标准格式。 3. **文件上传...

    httpclient4上传文件中文乱码问题解决办法代码示例

    服务器端自己写,本示例为客户端代码,可以解决httpClient4乱码问题,是替代修改源码的最佳写法。

    httpclient 上传文件

    总结起来,使用HTTPClient进行文件上传涉及创建POST请求、构建多部分实体、设置字符集,以及正确处理响应。乱码问题通常源于字符集不匹配,需在客户端和服务器端都进行适当的设置。理解这些知识点有助于在实际开发中...

    HttpClient PostMethod 上传文件

    提供的Demo项目可能包含了使用HttpClient发送GET和POST请求的完整示例代码,包括文件上传和乱码处理。通过对这些代码的分析和学习,你可以更好地理解和应用HttpClient进行网络通信。 总的来说,HttpClient是Java...

    https+spring3+httpclient4多文件上传

    文件上传过程中可能会遇到各种问题,如网络中断、文件过大、服务器错误等,因此需要编写适当的异常处理代码,确保程序健壮性。 8. **性能优化**: 对于大量文件上传,可以考虑使用异步或者多线程策略,以提高上传...

    Android使用HttpClient上传文件到服务器完整实例

    需要注意的是,由于Android API 23以后HttpClient被弃用,推荐使用`OkHttp`或者`Retrofit`等现代的网络库进行文件上传。但如果你的项目支持较低的Android版本,HttpClient仍然是一个可行的选择。 总结来说,Android...

    struts2 android httpclient 上传文件

    Struts2、Android和HttpClient是三个关键的技术领域,它们在本次文件上传的场景中相互结合。Struts2是一个流行的Java Web框架,用于构建MVC(模型-视图-控制器)结构的应用程序。Android是Google开发的移动操作系统...

    httpclient上传头像,图片,文件

    这个库为开发者提供了高级功能,例如异步处理、连接池管理和自定义请求方法,包括POST方式的文件上传。当我们需要通过网络上传头像或者文件时,HTTPClient提供了一个方便的解决方案。以下是关于这个主题的详细知识点...

    安卓文件下载上传解压相关-Android使用HttpClient实现上传下载功能并监控进度.rar

    接下来是文件上传。HttpClient同样支持POST请求来上传文件: 1. 创建HttpPost请求:`HttpPost`对象用于指定接收文件的URL。 2. 添加文件到请求:使用`MultipartEntityBuilder`构建一个多部分实体,添加文件作为...

    C# http方式文件上传客户端

    2. **创建MultipartFormDataContent**:文件上传通常使用多部分形式的数据内容,因此需要创建一个`MultipartFormDataContent`对象,用于封装文件和其他可能的表单数据。 ```csharp MultipartFormDataContent ...

    HttpClient实现POST GET和文件下载

    文件上传通常涉及Multipart/form-data格式,可以使用`MultipartEntityBuilder`来构造请求实体: 1. **创建HttpPost请求**:设定目标URL。 2. **构建MultipartEntity**:使用`MultipartEntityBuilder`添加文件和其他...

    Android基于HttpClient实现文件上传,提供进度条接口实现

    本教程将深入探讨如何利用Apache的HttpClient库实现文件上传,并且在上传过程中提供进度条接口,以便用户可以直观地看到文件传输的进度。我们将不依赖任何第三方jar包,而是直接对httpmime源码进行改造。 首先,...

    java代码模拟http上传文件_代码_类包

    以下是使用Apache HttpClient进行文件上传的一个基本步骤: 1. 引入依赖:在项目中添加Apache HttpClient库,如果使用Maven,可以在pom.xml中添加以下依赖: ```xml <groupId>org.apache.httpcomponents ...

    httpclient上传文件

    本篇文章将详细介绍如何使用Commons HttpClient进行文件上传。 一、Apache Commons HttpClient简介 Apache Commons HttpClient是一个强大的HTTP客户端API,它提供了丰富的功能,如连接管理、重试机制、身份验证等。...

Global site tag (gtag.js) - Google Analytics