1. 程式人生 > >HttpClient上傳檔案到微信素材亂碼問題解決

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();
不要設定編碼,模式設定要注意 不要設定編碼,模式設定要注意
不要設定編碼,模式設定要注意
重要的話要重複三遍?