MultipartEntityBuilder 転送添付ファイルに関する注意事項
先週、このMultipartEntityBuilderを使い、数日経ってようやくチューニングしました。ようやく動くようになった。
なぜこのMultipartEntityBuilderを使用するのか?
本来の動作は以下の通りです。
OAは会社の基幹データであり、イントラネットでしかアクセスできない。そして、転送の踏み台としてゲートウェイシステムを追加し、権限制約を設ける。
うまくいっていたのに、新たな要件として 外部事業者がワークフローを作成し、添付ファイルをアップロードできるようにする。 . 元の httpClient のフォームポスト json ベースのアプローチでは、添付ファイルをサポートしていませんでした。そこで、MultipartEntityBuilderを追加して、添付ファイルのアップロードをサポートするようにしました。
フォーム送信のようなアプローチに
フォームポスト
データです。{...}
ファイル...
ファイル...
ファイル...
使用方法
mavenをベースとしたシステムです。導入しています。
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.2</version>
</dependency>
次のコード・スニペットを使用してください。
//builder
MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
builder.setCharset(Consts.UTF_8);
//text content
StringBody contentBody = new StringBody(jsonContent,ContentType.APPLICATION_JSON);
builder.addPart("data", contentBody);
//files
if(files!=null && files.size()>0){
for(File file:files){
FileBody fb = new FileBody(file, ContentType.DEFAULT_BINARY);
String fileName = file.getName();
builder.addPart(fileName, fb);
}
}
//constitute the total content
builder.setContentType(ContentType.MULTIPART_FORM_DATA);
HttpEntity data = builder.build();
// submit
HttpUriRequest request = RequestBuilder.post(url.toString()).setEntity(data).build();
CloseableHttpResponse response = httpClient.execute(request);
問題点
ファイル名が文字化けする
Web上の多くのコードでは、BROWSER_COMPATIBLEが使われています。これはASICII文字のように見え、もう中国語をサポートしていません。RFC6532を使用するように変更する必要があります。
MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
http 411に対する応答
転送がHTTP 411に反応するのですが、さらに解決策をウェブで検索して、やっと解決しました。ここでいくつか設定しなければならないことがあります。
nginx.conf は client_max_body_size を大きく設定します。 . デフォルトでは、この設定には内容がありません。
ゲートウェイシステムは、springMVC, MultipartHttpServletRequestリクエストをベースにしています。content-lengthを設定するために、以下のようにオーバーロードする必要があります。
if(fileMap!=null && fileMap.size()>0){
for(String filename:fileMap.keySet()){
final MultipartFile mf = fileMap.get(filename);
InputStreamBody inputStreamBody = new InputStreamBody(mf.getInputStream(), filename){
@Override
public long getContentLength(){return mf.getSize();}
};
builder.addPart(filename, inputStreamBody);
}
}
テキスト中国語の混乱
ただ、パーツを追加したときに、パーツごとにcontent-typeが異なるんです。
// Each part of the submission has a different contentType. set the character set based on the contentType.
StringBody contentBody = new StringBody(reqJson,ContentType.APPLICATION_JSON);
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例