538
魔獸
httpclient3.0 上傳文件名及field中文解決方法
最近利用httpclient來做模擬表單提交的程序,發現這個咚咚對中文的支持實在是差,查看源碼後發現問題出現
在org\apache\commons\httpclient\util這個包裏的EncodingUtil.java,和org\apache\commons\httpclient\methods\multipart這個包裏的StringPart.java及FilePart.java這三個類裏麵。
先說說EncodingUtil這個類,雖然你可以在第50行看到
PRivate static final String DEFAULT_CHARSET = "iso-8859-1";
這樣的定義,但你在往下看就會發現getAsciiBytes(final String data)這個裏並沒有用這定義的編碼來對數據進行encoding.而是用了US-ASCII碼來進行encoding的。程序如下:
public static byte[] getAsciiBytes(final String data) {
if (data == null) {
throw new IllegalArgumentException("Parameter may not be null");
}
try {
return data.getBytes("US-ASCII"); //就是這一句拉
} catch (UnsupportedEncodingException e) {
throw new HttpClientError("HttpClient requires ASCII support");
}
}
把編碼該成你自己想要的吧。在這裏解決了上傳文件名為中文的問題。接下來解決field字段內容為中文的的問題
修改StringPart中58行:
public static final String DEFAULT_CHARSET = "US-ASCII";
同理,改成你自己想要的編碼
然後重新編譯打包。記得把logging 和codec 這兩個包引進項目裏。否則編譯會出一堆錯誤。
其實在StringPart這個類裏是提供了自定義編碼格式的方法。可是在FilePart類裏沒有實現而已。
第79行:
public StringPart(String name, String value, String charset) {
super(
name,
DEFAULT_CONTENT_TYPE,
charset == null ? DEFAULT_CHARSET : charset,
DEFAULT_TRANSFER_ENCODING
);
if (value == null) {
throw new IllegalArgumentException("Value may not be null");
}
if (value.indexOf(0) != -1) {
// See RFC 2048, 2.8. "8bit Data"
throw new IllegalArgumentException("NULs may not be present in string parts");
}
this.value = value;
}
你可以在FilePart裏把這個方法實現了。這樣你就可以指定編碼格式提交表單了。個人覺得這個方法比修改默認編碼強。靈活性高些。
其實我隻想模擬表單提交,在applet中實現文件上傳,本想偷懶不自己寫模擬表單提交這塊的。用了httpclient這個開源包。可是打完applet的jar包發現這個包竟然350多k。讓我非常的鬱悶。看來還是需要自己寫模擬表單實現提交了。起碼打完包也不會超過20k。
最後更新:2017-04-03 20:19:52