显示文件:找不到媒体类型= application / octet-stream的MessageBodyReader

时间:2015-01-28 17:07:27

标签: web-services jersey jax-rs

我的要求是我应该使用RESTFul服务显示文件。我在这里如何进行:

服务器:

@GET
@Path("/{name}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getFile {
    ...    
   return Response.ok(inputStream).header("Content-Disposition", "attachment; filename=" + fileName).build();

客户端:

final WebTarget target = createRestClient("path/" + fileName, new HashMap<String, Object>());
return target.request(MediaType.APPLICATION_OCTET_STREAM).get().readEntity(Part.class);

当我运行它时,我发现了这个错误:

MessageBodyReader not found for media type=application/octet-stream, type=interface javax.servlet.http.Part, genericType=interface javax.servlet.http.Part.

你知道这是从哪里来的吗?

感谢。

1 个答案:

答案 0 :(得分:1)

javax.servlet.http.Part应该用于获取上传多部分数据,并由servlet容器创建,您可以从HttpServletRequest获取。它不应该以这种方式使用。除了数据之外,甚至不是多部分。

相反,您只需从InputStream中获取Response,从标头中明确获取Content-Dispostion即可。像

这样的东西
Response response = target.request()
        .accept(MediaType.APPLICATION_OCTET_STREAM)
        .get();
// get InputStream
InputStream is = response.readEntity(InputStream.class);
// get Content-Disposition header
String contentDisposition = (String)response
        .getHeaderString(HttpHeaders.CONTENT_DISPOSITION);
// get filename
contentDisposition = contentDisposition
        .substring(contentDisposition.indexOf("filename=") + "filename".length() + 1);
System.out.println(contentDisposition);