【问题标题】:REST webservice get image? Path invalid?REST Web 服务获取图像?路径无效?
【发布时间】:2016-02-24 03:51:12
【问题描述】:

我有 REST Web 服务,它为我提供系统中的文件:

@Stateless
@Path("/print")
public class PictureWebservice {

    @GET
    @Path("/startPrint")
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    public Response getFile() {

        String path = "/mypath.JPG";
      File file = new File(path);
      return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM)
          .header("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"" ) //optional
          .build();
    }
}

如果我打开浏览器并输入: http://192.168.2.11:8080/rest/print/startPrint

=> 一切正常,我得到了图像。

但现在我想在另一台 PC 上保存我的文件: 文件file = new File("http://192.168.2.11:8080/rest/print/startPrint")

但是我得到了一个错误“FileNotFoundException”。怎么了?我猜路径无效?

【问题讨论】:

  • 192.168.2.11:8080/rest/print/startPrint ,这是一个 url 而不是文件路径
  • 在其他电脑上,在浏览器中输入 192.168.2.11:8080/rest/print/startPrint
  • 这个 url 有效,但我在我的 JAVA 程序中也需要它 File file = new File...
  • 如何监控打印状态?
  • 我认为监控打印状态超出了这个问题的范围。您可以提出其他问题,我们很乐意为您提供帮助。

标签: java web-services rest


【解决方案1】:

File 不适合这种情况。

要下载图像,您至少有两种方法:

使用URL

URL url = new URL("http://192.168.2.11:8080/rest/print/startPrint");
InputStream is = new BufferedInputStream(url.openStream();

使用JAX-RS Client API

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://192.168.2.11:8080/rest")
                         .path("print")
                         .path("startPrint");
Response response = target.request().get();
InputStream is = response.readEntity(InputStream.class);

既然你有一个InputStream,只需将它写入一个文件:

Path path = Paths.get("C:/temp", "download.png");
Files.copy(is, path);

【讨论】:

  • 谢谢 - 但我在这里遇到编译错误: InputStream is = response.readEntity(InputStream.class);这是错误消息:方法 readEntity(Class) 未定义类型 Response
  • @internet 确保您已导入 javax.ws.rs.core.Response 类。
  • 这里是:javax.ws.rsjavax.ws.rs-api2.0.1依赖>
  • @internet 我确定this method exists.
  • @internet 请给我更多有关您的环境的详细信息。你的 JAX-RS 实现是什么?球衣?高枕无忧?你的网络服务器是什么?
【解决方案2】:

您可以使用 Resteasy 等 Restful 客户端。

    ResteasyClient client = new ResteasyClientBuilder().build();
    ResteasyWebTarget target = client.target("http://localhost:8080/rest/status");
    Response response = target.request().get();
    String value = response.readEntity(String.class);
    System.out.println(value);
    response.close();

【讨论】:

  • “响应”来自哪个类?
  • javax.ws.rs.core.Response 它是java rs。
  • 比我在 String value = response.readEntity(String.class); 处得到一个错误; Response 类型的方法 readEntity(Class) 未定义
  • 也适用于 close 方法:方法 close() 未定义类型 Response
猜你喜欢
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
相关资源
最近更新 更多