【问题标题】:Black background when display an image in a REST API with Spring使用 Spring 在 REST API 中显示图像时的黑色背景
【发布时间】:2020-12-23 14:07:57
【问题描述】:

我想在发出GET-request 时返回指向图像(或图像本身)的链接。我看到了 Baeldung 的教程并决定使用它。代码如下所示:

@RequestMapping(value = "/image-manual-response", method = RequestMethod.GET)
public void getImageAsByteArray(HttpServletResponse response) throws IOException {
    InputStream in = servletContext.getResourceAsStream("/WEB-INF/images/image-example.jpg");
    response.setContentType(MediaType.IMAGE_JPEG_VALUE);
    IOUtils.copy(in, response.getOutputStream());
}

由于我无法弄清楚servletContext是什么并找到我需要的信息,所以我稍微改变了方法:

    @GetMapping("/image")
    public void getImageAsByteArray(HttpServletResponse response) throws IOException {

        InputStream in = new ByteArrayInputStream(("C:\\Users\\vartanyan\\Desktop\\images\\Puer").getBytes());
        response.setContentType(MediaType.IMAGE_JPEG_VALUE);
        IOUtils.copy(in, response.getOutputStream());
    }

结果,在 Swagger 中我得到了以下信息:

当我在单独的窗口中打开图像时,我得到以下信息:

如何解决这个问题?我正在使用Spring BootHibernatePostgreSQL 编写Rest MVC 应用程序。

【问题讨论】:

    标签: java spring image file-io inputstream


    【解决方案1】:

    我添加FileInputStream() 实现。例如:

    public void getDrinkImage(HttpServletResponse response, Long drinkId) throws IOException {
    
            String imageURL = drinkRepository.getById(drinkId).getImage();
    
            InputStream in = new FileInputStream(uploadPath + imageURL);
            response.setContentType(MediaType.IMAGE_JPEG_VALUE);
            IOUtils.copy(in, response.getOutputStream());
        }
    

    【讨论】:

      【解决方案2】:

      从请求中获取 servletContext,如下所示:

      @GetMapping("/image")
      public void getImageAsByteArray(HttpServletRequest request, HttpServletResponse response) throws IOException {
          InputStream in = request.getServletContext().getResourceAsStream("images/Puer.jpg");
          response.setContentType(MediaType.IMAGE_JPEG_VALUE);
          IOUtils.copy(in, response.getOutputStream());
      }
      

      【讨论】:

      • NullPointer 在变量 in
      • 你需要把你的文件放在应用程序上下文中(在你的war/jar中)
      • 在资源中?
      • 我在resources 文件夹中添加了一个包含图像的文件夹。现在路径看起来像这样:C:\Users\vartanyan\IdeaProjects\Coffeetearea\src\main\resources\images\Puer.jpg 但也是 NullPointer。在 Idea 中看起来像:InputStream in = request.getServletContext().getResourceAsStream("C:\\Users\\vartanyan\\IdeaProjects\\Coffeetearea\\src\\main\\resources\\images\\Puer.jpg");
      • InputStream in = request.getServletContext().getResourceAsStream("images/Puer.jpg"); 不工作
      【解决方案3】:

      试试这个代码:

      @GetMapping("/image")
          public void getImageAsByteArray(HttpServletRequest request, HttpServletResponse response) throws IOException {
              InputStream in = request.getServletContext().getResourceAsStream("C:\\Users\\vartanyan\\Desktop\\images\\Puer");
              response.setContentType(MediaType.IMAGE_JPEG_VALUE);
              IOUtils.copy(in, response.getOutputStream());
          }
      

      【讨论】:

      • 空指针。变量in = null
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多