【问题标题】:How to return an image to client side?如何将图像返回到客户端?
【发布时间】:2019-05-23 16:35:02
【问题描述】:

我需要一些帮助,我正在做一个类似于 9gag 的项目,我试图返回一个 JSON 对象,其中有一些数据和图像。

我尝试了几种方法,以字节数组返回图像并将 GetMapping 注释设置为产生 = "image/jpeg"。我也试过用 Base64 做,但由于我是使用 Base64 的新手,我不完全确定我是否正确使用它。

@GetMapping(value = "/")
    public List<PostDTO> browseAll() throws IOException {
        List<Media> dbMedia = mediaRepo.findAll();
        List<PostDTO> postDTOS = new ArrayList<>();
        for (Media media : dbMedia){
            postDTOS.add(media.convertToPostDTO());
        }
        for (PostDTO post : postDTOS){
            post.setFile(returnImage());
        }
        return postDTOS;
    }
    private String returnImage() throws IOException {
        List<Media> media = mediaRepo.findAll();
        for (Media file : media){
            File newImage = new File(file.getDir());
            FileInputStream fis = new FileInputStream(newImage);
            String encoded = Base64.getEncoder().encodeToString(fis.readAllBytes());
            String imgData = "data:image/jpeg;base64," + Base64Utils.decodeFromString(encoded);

            return imgData;

        }
        return "failed";
    }

通过使用produce =“image/jpec”我得到了这个-“已解决[org.springframework.web.HttpMediaTypeNotAcceptableException:找不到可接受的表示]”另外我正在使用邮递员进行测试。 还有一个 Json 对象的样子,在“文件”中,我想要实际的图像。

    {
        "author": "Uponn",
        "title": null,
        "likes": 0,
        "file": "data:image/jpeg;base64,[B@3acfd4dd",
        "uploadTime": null
    },

【问题讨论】:

  • 你想获取图片还是包含图片和数据的json?
  • 包含图像和数据的json。
  • 您是否从任何其他网站获得过这种 json 数据/响应?还是你想这样创作?
  • 我希望我的也是这样。尚未检查其他站点的 json 响应。为什么?这不是好方法吗?
  • 您必须思考,即使您能够生成 javascript 将如何转换该 json 消息以显示图像和文本数据?

标签: java spring


【解决方案1】:

根据上面的讨论,如果我的理解是正确的,您需要将图像发送给前端工程师,以便他们能够在网页中显示。我在下面提供了sn-p的代码,你可以试试。

@GetMapping(value = "/showImage", produces = "image/jpg")
  public ResponseEntity<byte[]> getImageAsResponseEntity(
      @RequestParam("fileName") String fileName) {
    String dirPath = "some path in your drive/";
    HttpHeaders headers = new HttpHeaders();
    InputStream in = null;
    byte[] media = new byte[0];
    try {
      in = new FileInputStream(dirPath + fileName);
      media = IOUtils.toByteArray(in);
    } catch (IOException e) {
      e.printStackTrace();
    }
    ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(media, headers, HttpStatus.OK);
    return responseEntity;
  }

【讨论】:

  • 您正在使用哪个 IOUtils 的确切类,因为我拥有的(org.apache.tomcat.util.http.fileupload.IOUtils)没有 .toByteArray 方法?
  • Apache Commons IO
  • 它确实有效,但仅适用于一张图片,但在我的情况下,因为我返回了几个对象,每张图片都有自己的图片,它似乎不起作用,它只返回图片的字节数组。好吧,我会尽力弄清楚感谢您的帮助。 :)
猜你喜欢
  • 2020-02-29
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
相关资源
最近更新 更多