Http Client MultiiprtRequest Entitファイルをアップロードして、中国語の文字化けの解決案
4862 ワード
以前にHttpClientシミュレーションによって第三者項目に登録されたコードを共有しましたが、今回はHttpClientが第三者プロジェクトインターフェースにアクセスしてファイルをアップロードする実現案を共有して、中国語の文字化け問題を解決しました.そしてファイルをアップロードする時に他のパラメータを複数転送します.
第一の方案では、中国語のパラメータはurlの内部にあり、URLEncoder類を使って中国語に対してencodeを行います.
この二つの案は普通の文字列パラメータの中国語の文字化け問題しか解決できません.アップロードされたファイル名の中国語の文字化け問題はset CharSet方法を使って符号化方式を設定できません.原因としては、ソースを調べても分かります.StringPartとFilePartは昼の処理方法が違っています.FilePartはファイル名を変換する時にファイル名を変更します.使った方法はEncecdingUtil.get AciiByttesです.この方法のソースコードはdata.getBytesです.だから中国語のファイル名は必ず文字化けします.解決は簡単です.out.write;添付ファイル名の中国語の文字化けを解決するにはソースコードを修正するしかないです.FilePartでは正午の文字化けから重要な部分は以下の通りです.
第一の方案では、中国語のパラメータはurlの内部にあり、URLEncoder類を使って中国語に対してencodeを行います.
public static void postTwo() throws Exception{
HttpClient client = new HttpClient();
//
PostMethod post = new PostMethod("http://127.0.0.1:8080/HelloWorld/post?host=172.16.2.183&port=10086&name=test&pw=test" + URLEncoder.encode(" ", "utf-8"));
FilePart fp = new FilePart("formFile", new File("D://PTOC_SCENIC_DAY_2015043015.txt"));
Part[] parts = {fp};
MultipartRequestEntity entity = new MultipartRequestEntity(parts, new HttpMethodParams());
post.setRequestEntity(entity);
client.executeMethod(post);
// ,
System.out.println("============================");
System.out.println(post.getResponseBodyAsString());
System.out.println("============================");
// ,
post.releaseConnection();
}
第二の方法は、Partクラスを使用して、このクラスは2つのサブクラス、一つのSteringPart、一つのFilePart、SteringPartは普通の文字列パラメータを転送するために使用され、FilePartはファイルをアップロードするために使用される:public static void postThree() throws Exception{
HttpClient client = new HttpClient();
//
PostMethod post = new PostMethod("http://127.0.0.1:8080/HelloWorld/post");
FilePart fp = new FilePart("formFile", "JNDI.txt", new File("D://JNDI _ .txt"));
fp.setCharSet("utf-8");
System.out.println(fp.getCharSet());
Part[] parts = { fp, new StringPart("host", "172.16.2.183", "UTF-8"),
new StringPart("port", "10086", "UTF-8"),
new StringPart("name", "test ", "UTF-8"),
new StringPart("pw", "test ", "UTF-8") };
MultipartRequestEntity entity = new MultipartRequestEntity(parts, new HttpMethodParams());
post.setRequestEntity(entity);
System.out.println(entity.getContentType());
client.executeMethod(post);
// ,
System.out.println("============================");
System.out.println(post.getResponseBodyAsString());
System.out.println("============================");
// ,
post.releaseConnection();
}
以上の2つの案に対応する第三者プロジェクトのインターフェースコードは以下の通りです.@RequestMapping(value = "/post", method = { RequestMethod.POST })
public @ResponseBody Map<String, Object> post(@RequestParam(value = "host") String host,
@RequestParam("port") String port,
@RequestParam("name") String name,
@RequestParam("pw") String pw,
@RequestParam("formFile") MultipartFile formFile) {
Map<String, Object> map = new HashMap<String, Object>();
try{
map.put("tag", "1");
map.put("msg", " !");
System.out.println(host + ":" + port + " " + name + " " + pw);
String fileName = formFile.getOriginalFilename();
FileOutputStream write = new FileOutputStream("D://ww" + fileName);
InputStream read = formFile.getInputStream();
byte data[] = new byte[1024];
int count;
while ((count = read.read(data, 0, 1024)) != -1) {
write.write(data, 0, count);
}
read.close();
write.close();
}catch (Exception e) {
e.printStackTrace();
map.put("tag", "0");
map.put("msg", " :" + e.getMessage());
}
return map;
}
この二つの案は普通の文字列パラメータの中国語の文字化け問題しか解決できません.アップロードされたファイル名の中国語の文字化け問題はset CharSet方法を使って符号化方式を設定できません.原因としては、ソースを調べても分かります.StringPartとFilePartは昼の処理方法が違っています.FilePartはファイル名を変換する時にファイル名を変更します.使った方法はEncecdingUtil.get AciiByttesです.この方法のソースコードはdata.getBytesです.だから中国語のファイル名は必ず文字化けします.解決は簡単です.out.write;添付ファイル名の中国語の文字化けを解決するにはソースコードを修正するしかないです.FilePartでは正午の文字化けから重要な部分は以下の通りです.
protected void sendDispositionHeader(OutputStream out) throws IOException {
LOG.trace("enter sendDispositionHeader(OutputStream out)");
super.sendDispositionHeader(out);
String filename = this.source.getFileName();
if (filename != null) {
out.write(FILE_NAME_BYTES);
out.write(QUOTE_BYTES);
out.write(EncodingUtil.getAsciiBytes(filename));
out.write(QUOTE_BYTES);
}
}