LoginSignup
3
3

More than 5 years have passed since last update.

ApacheのHttpClientで日本語のファイル名の画像を送信する

Last updated at Posted at 2016-07-04

この記事では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クラスを使用するときは
文字化けしたらエンコード指定を疑ってください。

ヘッダーもボディも基本は書いておいたほうが無難です。

3
3
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3