• HttpClient 4.3.* 上传带中文文件名文件文件名乱码问题的解决


    又是折腾了一天才解决的问题,网上关于这个问题的资料不多,希望写出来能帮到有需要的人。

    之前无论怎么设置charset都不起作用,

    后来看了这篇文章 才发现MultipartEntityBuilder有一个setMode的方法

    可以设置成以浏览器兼容模式运行,设置后便不会乱码了。

    下面是测试的源码:

    import java.io.File;
    import java.io.IOException;
    import java.nio.charset.Charset;
    
    import org.apache.http.Consts;
    import org.apache.http.HttpEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.ContentType;
    import org.apache.http.entity.mime.HttpMultipartMode;
    import org.apache.http.entity.mime.MultipartEntityBuilder;
    import org.apache.http.entity.mime.content.FileBody;
    import org.apache.http.entity.mime.content.StringBody;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.CharsetUtils;
    import org.apache.http.util.EntityUtils;
    
    public class FileUploadTest {
    
        /**
         * 这个例子展示了如何执行请求包含一个多部分编码的实体 模拟表单提交
         * 
         * @throws IOException
         */
        public static void main(String[] args) throws IOException {
            CloseableHttpClient httpClient = HttpClients.createDefault();
            
            try {
                // 要上传的文件的路径
                String filePath = new String("D:\吹风.gif");
                // 把一个普通参数和文件上传给下面这个地址 是一个servlet
                HttpPost httpPost = new HttpPost(
                        "http://localhost:8080/abc/updateUserBgImg");
                // 把文件转换成流对象FileBody
                File file = new File(filePath);
                FileBody bin = new FileBody(file);  
                StringBody userId = new StringBody(
                        "用户ID", ContentType.create(
                                "text/plain", Consts.UTF_8));
    //以浏览器兼容模式运行,防止文件名乱码。   HttpEntity reqEntity
    = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addPart("multipartFile", bin) .addPart("userId", userId).setCharset(CharsetUtils.get("UTF-8")).build(); httpPost.setEntity(reqEntity); System.out.println("发起请求的页面地址 " + httpPost.getRequestLine()); // 发起请求 并返回请求的响应 CloseableHttpResponse response = httpClient.execute(httpPost); try { System.out.println("----------------------------------------"); // 打印响应状态 System.out.println(response.getStatusLine()); // 获取响应对象 HttpEntity resEntity = response.getEntity(); if (resEntity != null) { // 打印响应长度 System.out.println("Response content length: " + resEntity.getContentLength()); // 打印响应内容 System.out.println(EntityUtils.toString(resEntity, Charset.forName("UTF-8"))); } // 销毁 EntityUtils.consume(resEntity); } finally { response.close(); } } finally { httpClient.close(); } } }
  • 相关阅读:
    Webservise如何Webservise实现打印
    GridView和FormView中对时间的末尾处理
    WebService系统结构设计
    Panel的用法
    Div+CSS选项卡
    java运行环境配置
    电子商务购物车
    电子商务配置管理
    电子商务订单生成
    spring+redis+mysql做缓存操作 look
  • 原文地址:https://www.cnblogs.com/kcher90/p/3579777.html
Copyright © 2020-2023  润新知