この記事ではWindows 7にインストールしたjdk1.8.0_92を使って
Eclipse4.4.2で実行しています。
1. 概要
問題
日本語のファイル名の画像をポストで送信すると文字化けしてしまう。
解決方法
MultipartEntityBuilderクラスのsetCharsetメソッドを使用してエンコードを行う。
2. 詳細
ソース
外部API連携のツール作成時に、「画像.png」のようなファイル名が
「??.png」として送信されてしまう問題が起こりました。
UploadAsset.java
HttpPost post = new HttpPost(HOST_NAME + URL_UPLOAD_ASSET);
// ヘッダー情報を付与
List<Header> headers = new ArrayList<Header>();
headers.add(new BasicHeader("Content-Type", "multipart/form-data;charset=UTF-8"));
// アクセス権限
headers.add(new BasicHeader(AUTHORIZATION, "アクセストークン"));
// クライアント作成
HttpClient client = HttpClientBuilder.create()
.setDefaultHeaders(headers).build();
// ボディに画像情報を付与
File file = new File("送信元の画像ファイルのパス");
String filePath = "送信先の配置したいパス";
String fileName = "画像.png";
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
// このfileNameが文字化けしてしまう
builder.addBinaryBody(FILE, file, ContentType.DEFAULT_BINARY, fileName);
builder.addTextBody(PATH, filePath, ContentType.TEXT_PLAIN);
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);
修正箇所
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
この部分に真ん中の一行を追加しました。
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setCharset(StandardCharsets.UTF_8);
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
3. まとめ
MultipartEntityBuilderクラスを使用するときは
文字化けしたらエンコード指定を疑ってください。
ヘッダーもボディも基本は書いておいたほうが無難です。