HttpClient上传文件到微信素材乱码问题解决

在开发微信第三方公众平台的时候,需要上传图片、语音等文件到微信服务器。当文件名存在中文时会出现乱码。网上搜了一大堆文章,大部讲什么设置编码啥的,放到微信素材上传这个场景就是用不了,试了各种方式,依然是乱码。

所有的文章在微信这个场景上都有两个大坑。
下面我copy下别人的代码,然后标注出来:
原文链接如下: http://blog.csdn.net/fengyuzhengfan/article/details/40792529

HttpClient的上传代码,基本上都类似,我就不重复写了,直接贴一段他的代码:

-------------------------------------------------
ContentType contentType = ContentType.create(HTTP.PLAIN_TEXT_TYPE, HTTP.UTF_8);        
HttpClient client=new DefaultHttpClient();// 开启一个客户端 HTTP 请求   
HttpPost post = new HttpPost(url);//创建 HTTP POST 请求    
MultipartEntityBuilder builder = MultipartEntityBuilder.create();  
builder.setCharset(Charset.forName(HTTP.UTF_8));//设置请求的编码格式  
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式  

int count=0;  
for (File file:files) {  
//          FileBody fileBody = new FileBody(file);//把文件转换成流对象FileBody  
//          builder.addPart("file"+count, fileBody);  
    builder.addBinaryBody("file"+count, file);  
    count++;  
}         
builder.addTextBody("method", params.get("method"));//设置请求参数  
builder.addTextBody("fileTypes", params.get("fileTypes"));//设置请求参数  
StringBody stringBody=new StringBody("中文乱码",contentType);  
builder.addPart("test", stringBody);  
HttpEntity entity = builder.build();// 生成 HTTP POST 实体        
post.setEntity(entity);//设置请求参数  
HttpResponse response = client.execute(post);// 发起请求 并返回请求的响应  
if (response.getStatusLine().getStatusCode()==200) {  
    return true;  
}  
return false;  
-------------------------------------------------

上面高亮的两个地方就是在微信素材上传时的两个大坑。

1、当遇到乱码时,第一错觉就是设置请求的编码格式,恰恰在微信上传时,如果设置这个编码,就会导致多媒体文件丢失,上传不成功。(具体原因不明)
2、设置浏览器兼容模式,这个好多文章说,设置成BOWSER_COMPATIBLE 就不会乱码了,问题就出现在这里,设置模式时,应该设置成HttpMultipartMode.RFC6532
这样才是真正的不会出现乱码。

好了,把上面指出来的两个地方改一下,微信素材上传中文乱码问题解决了。有遇到同样情况的,可以试下。

然后有些代码还在用MultipartEntity这个弃用的类,建议改成新的MultipartEntityBuilder
简便写法:
HttpEntity entity = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532).addPart("media", bin).build();
不要设置编码,模式设置要注意
不要设置编码,模式设置要注意
不要设置编码,模式设置要注意
重要的话要重复三遍?

你可能感兴趣的:(Java)