【问题标题】:How to return an Image to browser in rest API in JAVA?如何在 JAVA 的 rest API 中将图像返回给浏览器?
【发布时间】:2018-03-18 10:28:25
【问题描述】:

我想在点击localhost:8080:/getImage/app/path={imagePath} 之类的 API 时获取图像

当我点击这个 API 时,它会返回一个图片。

这可能吗?

实际上,我已经尝试过了,但它给了我一个错误。 这是我的代码,

@GET
@Path("/app")
public BufferedImage getFullImage(@Context UriInfo info) throws MalformedURLException, IOException {
    String objectKey = info.getQueryParameters().getFirst("path");

    return resizeImage(300, 300, objectKey);
}


public static BufferedImage resizeImage(int width, int height, String imagePath)
        throws MalformedURLException, IOException {
    BufferedImage bufferedImage = ImageIO.read(new URL(imagePath));
    final Graphics2D graphics2D = bufferedImage.createGraphics();
    graphics2D.setComposite(AlphaComposite.Src);
    // below three lines are for RenderingHints for better image quality at cost of
    // higher processing time
    graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    graphics2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    graphics2D.drawImage(bufferedImage, 0, 0, width, height, null);
    graphics2D.dispose();
    System.out.println(bufferedImage.getWidth());
    return bufferedImage;
}

我的错误,

java.io.IOException: The image-based media type image/webp is not supported for writing

有什么方法可以在点击 java 中的任何 URL 时返回图像?

【问题讨论】:

  • 将图像存储为 base64 编码字符串并返回该字符串。如果需要,我可以提供示例代码

标签: spring restful-url java


【解决方案1】:

您可以使用IOUtils。这是代码示例。

@RequestMapping(path = "/getImage/app/path/{filePath}", method = RequestMethod.GET)
public void getImage(HttpServletResponse response, @PathVariable String filePath) throws IOException {
    File file = new File(filePath);
    if(file.exists()) {
        String contentType = "application/octet-stream";
        response.setContentType(contentType);
        OutputStream out = response.getOutputStream();
        FileInputStream in = new FileInputStream(file);
        // copy from in to out
        IOUtils.copy(in, out);
        out.close();
        in.close();
    }else {
        throw new FileNotFoundException();
    }
}

【讨论】:

    【解决方案2】:

    我没有测试它,因为我在这台机器上没有环境,但逻辑上它应该像下面这样工作,将它作为输入流读取并让你的方法返回@ResponseBody byte[]

    @GET
    @Path("/app")
    public @ResponseBody byte[] getFullImage(@Context UriInfo info) throws MalformedURLException, IOException {
        String objectKey = info.getQueryParameters().getFirst("path");
    
        BufferedImage image = resizeImage(300, 300, objectKey);
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ImageIO.write(image, "jpg", os);
        InputStream is = new ByteArrayInputStream(os.toByteArray());
        return IOUtils.toByteArray(is);
    }
    

    更新 根据@Habooltak Ana 的建议,不需要创建输入流,代码应如下所示

    @GET
    @Path("/app")
    public @ResponseBody byte[] getFullImage(@Context UriInfo info) throws
    MalformedURLException, IOException {
        String objectKey = info.getQueryParameters().getFirst("path");
    
        BufferedImage image = resizeImage(300, 300, objectKey);
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ImageIO.write(image, "jpg", os);
        return os.toByteArray();
    }
    

    【讨论】:

    • 嗨,您在此方法中返回的输入流正在返回 byte[] 数组。它给出了错误。我应该在 pom.xml 或任何文件中添加一些东西吗?
    • 你是对的,我告诉过你我没有这台机器的环境,但是我已经更新了答案,请检查
    • 直接返回os.toByteArray()会更好
    【解决方案3】:

    只需返回具有正确 HTTP 标头(Content-TypeContent-Disposition)的文件对象即可在大多数情况/环境中工作。

    伪代码

    File result = createSomeJPEG(); 
    /*
     e.g.
     RenderedImage rendImage = bufferedImage;
     File file = new File("filename.jpg");
     ImageIO.write(rendImage, "jpg", file);
    */
    response().setHeader("Content-Disposition", "attachment;filename=filename.jpg;");
    response().setHeader("Content-Type", "image/jpeg");
    return ok(result);
    

    另见:

    【讨论】:

      【解决方案4】:

      这是一个简单的解决方案:

      @GET
      @Path("/somePath")
      public void getImage(@Context HttpServletResponse res) throws IOException {
          java.nio.file.Path path = Paths.get("filePath");
          res.getOutputStream().write(Files.readAllBytes(path));
          res.getOutputStream().flush();
      }
      

      【讨论】:

        猜你喜欢
        • 2016-02-03
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 2021-06-30
        • 1970-01-01
        相关资源
        最近更新 更多