最近利用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這個類里是提供了自定義編碼格式的方法??墒窃贔ilePart類里沒有實現而已。
第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。
假如需要轉載,請注明出處和作者。謝謝
QQ:221704
MSN:flyly@yeah.net
EMAIL:zhangfl@sports.cn
新聞熱點
疑難解答