HttpClient上传文件

今天在写微信的多媒体上传下载接口,当时无论采用哪一个API都无法提交正确提交数据过去,不是连接不了微信服务器,就是微信服务器返回数据错误,后台百度了下,找到一篇文章,但不是用HttpClient写的,他是直接用jdk自带的URLConnection提交的数据。初看之下,想想HttpClient应该也可以做到的,也就仿照了下那哥们组装了下数据尝试下,用了StringEntity、FileEntity、InputStreamEntity都无法正确提交数据。后来出去抽了支烟,理清下思路。重写来过,结果竟然成功了,具体的结合下面的代码分析。

  1. 下面代码使用HttpClient代码提交了一个POST请求给微信服务器。

    /**
         * HttpClient POST请求 ,上传多媒体文件
         *
         * @param url
         *            请求地址
         * @param params
         *            参数列表
         * @return 响应字符串
         * @throws UnsupportedEncodingException
         * @Author Jie
         * @Date 2015-2-12
         */
        public static String postMethod2(String url, String filePath) {
            log.info("------------------------------HttpClient POST开始-------------------------------");
            log.info("POST:" + url);
            log.info("filePath:" + filePath);
            if (StringUtils.isBlank(url)) {
                log.error("post请求不合法,请检查uri参数!");
                return null;
            }
            StringBuilder content = new StringBuilder();
    
            // 模拟表单上传 POST 提交主体内容
            String boundary = "-----------------------------" + new Date().getTime();
            // 待上传的文件
            File file = new File(filePath);
    
            if (!file.exists() || file.isDirectory()) {
                log.error(filePath + ":不是一个有效的文件路径");
                return null;
            }
    
            // 响应内容
            String respContent = null;
            InputStream is = null;
            OutputStream os = null;
            File tempFile = null;
            CloseableHttpClient httpClient = null;
            HttpPost httpPost = null;
            try {
                // 创建临时文件,将post内容保存到该临时文件下,临时文件保存在系统默认临时目录下,使用系统默认文件名称
                tempFile = File.createTempFile(new SimpleDateFormat("yyyy_MM_dd").format(new Date()), null);
                os = new FileOutputStream(tempFile);
                is = new FileInputStream(file);
    
                os.write(("--" + boundary + "\r\n").getBytes());
                os.write(String.format("Content-Disposition: form-data; name=\"media\"; filename=\"" + file.getName() + "\"\r\n").getBytes());
                os.write(String.format("Content-Type: %s\r\n\r\n", FileUtils.getMimeType(file)).getBytes());
    
                // 读取上传文件
                BufferedInputStream bis = new BufferedInputStream(is);
                byte[] buff = new byte[8096];
                int len = 0;
                while ((len = bis.read(buff)) != -1) {
                    os.write(buff, 0, len);
                }
    
                os.write(("\r\n--" + boundary + "--\r\n").getBytes());
    
                httpClient = HttpClients.createDefault();
                // 创建POST请求
                httpPost = new HttpPost(url);
    
                // 创建请求实体
                FileEntity reqEntity = new FileEntity(tempFile, ContentType.MULTIPART_FORM_DATA);
    
                // 设置请求编码
                reqEntity.setContentEncoding("UTF-8");
                httpPost.setEntity(reqEntity);
                // 执行请求
                HttpResponse response = httpClient.execute(httpPost);
                // 获取响应内容
                respContent = repsonse(content, response, "POST");
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    close(tempFile, os, is, httpPost, httpClient);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            log.info("Respone:" + respContent);
            log.info("------------------------------HttpClient POST结束-------------------------------");
            return respContent;
        }
  2. 下面代码是获取微信服务器相应内容。

    /**
         * 获取响应内容,针对MimeType为text/plan、text/json格式
         *
         * @param content
         *            响应内容
         * @param response
         *            HttpResponse对象
         * @param method
         *            请求方式 GET|POST
         * @return 转为UTF-8的字符串
         * @throws ParseException
         * @throws IOException
         * @Author Jie
         * @Date 2015-2-28
         */
        private static String repsonse(StringBuilder content, HttpResponse response, String method) throws ParseException, IOException {
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();// 响应码
            String reasonPhrase = statusLine.getReasonPhrase();// 响应信息
            if (statusCode == 200) {// 请求成功
                HttpEntity entity = response.getEntity();
                log.info("MineType:" + entity.getContentType().getValue());
                content.append(EntityUtils.toString(entity));
            } else {
                log.error(method + ":code[" + statusCode + "],desc[" + reasonPhrase + "]");
            }
            return new String(content.toString().getBytes("ISO8859-1"), "UTF-8");
        }

总结:最后使用了FileEntity这个请求实体,成功将多媒体文件上传到微信服务器上面,获得了微信服务器返回的media_id。接口是实现了,但是总觉得哪里还有什么需要改善的地方。

时间: 2024-10-13 14:48:15

HttpClient上传文件的相关文章

httpclient 上传文件、下载文件

用httpclient4.3 post方式推送文件到服务端   准备:httpclient-4.3.3.jar:httpcore-4.3.2.jar:httpmime-4.3.3.jar 标签: <无> 代码片段(1)[全屏查看所有代码] 1. [代码][Java]代码 /**  * 上传文件  * @throws  ParseException  * @throws  IOException  */    publicstaticvoidpostFile()throwsParseExcept

Xamarin.Forms 使用HttpClient上传文件

Xamarin.Forms 使用HttpClient上传文件 在应用开发中,上传图片很多时候都是不可避免的问题: 以下用HttpClient实现的上传文件代码: 1 public static async Task<string> UploadFileAsync(string url ,string path) 2 { 3 using (var client = new HttpClient()) 4 { 5 using (var content = new MultipartFormData

[转]httpclient 上传文件、下载文件

用httpclient4.3 post方式推送文件到服务端  准备:httpclient-4.3.3.jar:httpcore-4.3.2.jar:httpmime-4.3.3.jar/** * 上传文件 * @throws ParseException * @throws IOException */ publicstaticvoidpostFile()throwsParseException, IOException{ CloseableHttpClient httpClient = Htt

网络编程之使用HttpClient上传文件的客户端和服务器

1.1客户端: HttpClient常用HttpGet和HttpPost这两个类,分别对应Get方式和Post方式. 无论是使用HttpGet,还是使用HttpPost,都必须通过如下3步来访问HTTP资源. 1.创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象. 2.使用DefaultHttpClient类的execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象. 3.通过HttpResp

httpclient上传文件乱码

String targetUrl = "http://localhost:8080/Test"; PostMethod filePost = new PostMethod(targetUrl) {//这个用来中文乱码 public String getRequestCharSet() { return "UTF-8";// } }; try { HttpClient client = new HttpClient(); File file = new File(&q

HttpClient 上传文件

/// <summary> /// 发送post请求 /// </summary> /// <param name="filePath">文件路径</param> /// <param name="pID">患者ID</param> /// <returns></returns> public static string HttpPostRequst(string fil

Android网络编程之使用HttpClient批量上传文件

请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 我曾在<Android网络编程之使用HTTP访问网络资源>一文中介绍过HttpCient的使用,这里就不在累述了,感兴趣的朋友可以去看一下.在这里主要介绍如何通过HttpClient实现文件上传. 1.预备知识: 在HttpCient4.3之前上传文件主要使用MultipartEntity这个类,但现在这个类已经不在推荐使用了.随之替代它的类是MultipartEntityBuilder. 下面

Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听

请尊重他人的劳动成果,转载请注明出处: Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听 运行效果图: 我曾在<Android网络编程之使用HttpClient批量上传文件>一文中介绍过如何通过HttpClient实现多文件上传和服务器的接收.在上一篇主要使用Handler+HttpClient的方式实现文件上传.这一篇将介绍使用AsyncTask+HttpClient实现文件上传并监听上传进度. 监控进度实现: 首先

转 Android网络编程之使用HttpClient批量上传文件 MultipartEntityBuilder

请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 http://www.tuicool.com/articles/Y7reYb 我曾在<Android网络编程之使用HTTP访问网络资源>一文中介绍过HttpCient的使用,这里就不在累述了,感兴趣的朋友可以去看一下.在这里主要介绍如何通过HttpClient实现文件上传. 1.预备知识: 在HttpCient4.3之前上传文件主要使用MultipartEntity这个类,但现在这个类已经不在推