在開發微信第三方公衆平臺的時候,須要上傳圖片、語音等文件到微信服務器。當文件名存在中文時會出現亂碼。網上搜了一大堆文章,大部講什麼設置編碼啥的,放到微信素材上傳這個場景就是用不了,試了各類方式,依然是亂碼。瀏覽器
全部的文章在微信這個場景上都有兩個大坑。
下面我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();對象
不要設置編碼,模式設置要注意
不要設置編碼,模式設置要注意
不要設置編碼,模式設置要注意
重要的話要重複三遍?