png 画像用の RESTful Web サービスを実装するために Jersey (ver 1.9.1) を使用しています。クライアント側で Apache HttpClient (ver. 4x) を使用しています。クライアント側のコードは、HttpGet を呼び出して画像をダウンロードします。ダウンロードが成功すると、InputStream が HttpEntity からディスクに保存されます。問題は結果ファイルであり、サーバー上のファイルは異なります。クライアント コードによって生成された出力イメージ ファイルはレンダリングできません。
@GET
@Path("/public/profile/{userId}")
@Produces({ "image/png" })
public Response getImage(@PathParam(value = "userId") String userId) {
Response res = null;
// ImageManagement.gerProfilePicture(userId) returns me profile picture
// of the provided userId in PathParam
File imageFile = ImageManagement.getProfilePicture(userId);
if (imageFile == null) {
res = Response.status(Status.NOT_FOUND).build();
} else {
res = Response
.ok(imageFile, "image/png")
.header("Content-Disposition",
"attachment; filename=Img" + userId + ".png")
.build();
}
return res;
}
以下の私のクライアントコードは、上記のリソースメソッドを呼び出します
private File downloadProfilePicture(String userId) throws IOException{
// URIHelper is a utility class, this give me uri for image resource
URI imageUri = URIHelper.buildURIForProfile(userId);
HttpGet httpGet = new HttpGet(imageUri);
HttpResponse httpResponse = httpClient.execute(httpGet);
int statusCode = httpResponse.getStatusLine().getStatusCode();
File imageFile = null;
if (statusCode == HttpURLConnection.HTTP_OK) {
HttpEntity httpEntity = httpResponse.getEntity();
Header[] headers = httpResponse.getHeaders("Content-Disposition");
imageFile = new File(OUTPUT_DIR, headers[0].getElements()[0]
.getParameterByName("filename").getValue());
FileOutputStream foutStream = new FileOutputStream(imageFile);
httpEntity.writeTo(foutStream);
foutStream.close();
}
return imageFile;
}
ここでの問題は、サーバーに存在するファイルとダウンロードされたファイルが異なることです。
以下は、サーバーに存在するファイルのダンプです。
以下は、ダウンロードしたファイルのダンプです。
ご覧のとおり、いくつかのバイトが変更されています。JerseyサーバーAPIは、ファイルからストリーム内のデータを変更していますか? 何がうまくいかないのですか?
アップデート:
ブラウザから同じ URL にアクセスすると、ファイルはダウンロードされますが、ダウンロードしたファイルは表示されません。したがって、問題はサーバーに関連しているようです。