自分が失敗したならあと10人は失敗しているだろう(ゴキブリ理論)
タイトル対応中にmultipartで詰まった、ということで失敗備忘録です。
multipartでテキストと画像データをPost
以下を参考に実装
問題発生
サーバーへテキストと画像を送信できた。がしかし、テキスト内の日本語が文字化けしている。
1.日本語以外(英字/数字)は文字化けなし。
2.画像は壊れることなく送信できている。
原因
DataOutputStream
への書き込みを直接writeBytes
で実装しているため、
AndroidOS
標準の文字コード(UTF-8以外のなにか(未調査))でエンコードされていた。
対応
writeBytes
は使用せず、一度StringBuilderであつめてからByte変換するようにした。
RestUtility.java
// 以下内容は参考元より多少の改変をしています
final String BOUNDARY= "**BOUNDARY**";
final String lineEnd = "\r\n";
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
StringBuilder builder = new StringBuilder();
// 一度StringBuilderに格納し
builder.append("--").append(BOUNDARY).append(lineEnd);
builder.append("Content-Disposition: form-data;name=\"").append(entry.getKey()).append("\"").append(lineEnd);
builder.append("Content-Type: text/plain; charset=UTF-8").append(lineEnd);
builder.append("Content-Transfer-Encoding: 8bit").append(lineEnd);
builder.append(lineEnd);
builder.append(entry.getValue());
builder.append(lineEnd);
// UTF-8を指定してByte変換(DataOutputStreamの関数を使用しない)
outputStream.write(builder.toString().getBytes(StandardCharsets.UTF_8));
あとがき
気づいてみればごくごく普通のことだった。
文字コードが絡んだならば、厳戒態勢を敷こう!!!!!
オイオイオイオイ!!
もっといい書き方があるぜぇ!!!!!
というとき、すみませんがコメントにてご指摘ください。
参考
Apache HTTP Client の削除