在开发微信第三方公众平台的时候,须要上传图片、语音等文件到微信服务器。当文件名存在中文时会出现乱码。网上搜了一大堆文章,大部讲什么设置编码啥的,放到微信素材上传这个场景就是用不了,试了各类方式,依然是乱码。浏览器
全部的文章在微信这个场景上都有两个大坑。
下面我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;
-------------------------------------------------post
上面高亮的两个地方就是在微信素材上传时的两个大坑。ui
一、当遇到乱码时,第一错觉就是设置请求的编码格式,偏偏在微信上传时,若是设置这个编码,就会致使多媒体文件丢失,上传不成功。(具体缘由不明)
二、设置浏览器兼容模式,这个好多文章说,设置成BOWSER_COMPATIBLE 就不会乱码了,问题就出如今这里,设置模式时,应该设置成HttpMultipartMode.RFC6532
这样才是真正的不会出现乱码。编码
好了,把上面指出来的两个地方改一下,微信素材上传中文乱码问题解决了。有遇到一样状况的,能够试下。url
而后有些代码还在用MultipartEntity这个弃用的类,建议改为新的MultipartEntityBuilderspa
简便写法:.net
HttpEntity entity = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532).addPart("media", bin).build();对象
不要设置编码,模式设置要注意
不要设置编码,模式设置要注意
不要设置编码,模式设置要注意
重要的话要重复三遍?