webHDFS REST API を介して HDFS にファイルを書き込むために、MultiPartEntity で HttpPut を実行しています。リクエスト自体は通過し、正しいレスポンス 307 と 201 が返されます。ただし、画像には、以下に示すように、その一部としてマルチパート ヘッダーも書き込まれており、取得して開くのに有効な画像ではありません。
--8DkJ3RkUHahEaNE9Ktw8NC1TFOqegjfA9Ps
Content-Disposition: フォームデータ。名前="ファイル"; filename="advert.jpg"
Content-Type: application/octet-stream
ÿØÿàJFIFHHÿÛC // 残りの画像コンテンツ
--8DkJ3RkUHahEaNE9Ktw8NC1TFOqegjfA9Ps
画像ファイルからマルチパート ヘッダーを削除すると、有効な画像になりますが、そもそもそれを回避する方法がわかりません。webHDFSが実際にファイルを書き込む責任があるため、これを制御できるかどうかさえわかりません。
これが私のコードです。他にすべきことはありますか?
final String LOCATION = "Location";
final String writeURI = "http://<ip>:50070/webhdfs/v1/user/hadoop/advert.jpg";
HttpPut put = new HttpPut(writeURI);
HttpClient client = HttpClientBuilder.create().build();
HttpResponse response = client.execute(put);
put.releaseConnection();
String redirectUri = null;
Header[] headers = response.getAllHeaders();
for(Header header : headers)
{
if(LOCATION.equalsIgnoreCase(header.getName()))
{
redirectUri = header.getValue();
}
}
HttpPut realPut = new HttpPut(redirectUri);
realPut.setEntity(buildMultiPartEntity("advert.jpg"));
HttpResponse response2 = client.execute(realPut);
private HttpEntity buildMultiPartEntity(String fileName)
{
MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();
multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
multipartEntity.addPart("file", new FileBody(new File(fileName)));
return multipartEntity.build();
}
どんな助けでも大歓迎です。