閱讀538 返回首頁    go 魔獸


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

  上一篇:go 始按鈕回歸Windows勢在必行
  下一篇:go ibatis運行的SQL語句的輸出——通過配置log4j