我正在使用 Jersey (ver 1.9.1) 为 png 图像实现 RESTful Web 服务。我在客户端使用 Apache HttpClient(版本 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,它会下载文件但下载的文件不可见。所以这个问题似乎与服务器有关。