提问者:小点点

如何通过指向REST api的href标签显示图像?


我正在构建一些Web应用程序。在我的前端,我需要显示之前上传到spring-boot hsqldb的图像。图像数据在数据库中以BLOB类型存储。我想将它们显示为:

<img href="/api/photos/0">

过去,我向我的api发送GET请求以获取字节数组的图像数据,而不是将其编码为Base64,以字符串“data: image/jpg;base64,myData”发送回来并将其放入img src,它工作得很好。现在我想检查一些不同的方法,我被卡住了。

这是我的vue模板:

<div class="card">
   <div class="card-header"><h4>Some header</h4></div>
   <div class="card-body">
       <img class="card-img-top" :href="url">
   </div>
</div>

这是我的vue方法构建url:

    export default {
        data(){
            return{
                url:''
            }
        },
        mounted() {
            this.makeUrl();
        },
        methods:{
            makeUrl(){
                this.url="/api/photos/0";
            }
        }
    }

这是我的spring-boot api控制器:

    @GetMapping(value = "/photos/{id}")
    public String readPhoto(@PathVariable Long id){
        return makePhotoUrl(photosRepository.findById(id).get().getData());
    }

    private String makePhotoUrl(byte[] photo){
        String photoUrl = "data:image/jpeg;base64," + 
        Base64.getEncoder().encodeToString(photo);
        return photoUrl;
    }

我确实通过浏览器直接访问url来获取图像数据,但我的卡仍然是空的。

请帮助,因为我没有更多的想法如何使它工作。


共1个答案

匿名用户

所以,经过又一天的研究,我终于弄清楚了。基本上我犯了两个错误。首先,href指定链接目的地,但它应该只与“a”标签一起使用:

<a href = "www.someWebsite.com">link</a>

如果我想指定img源,我应该使用“src”:

<img src = "www.someOtherWebsite.com">

其次,如果我想返回url作为api的直接响应,它必须指向一个物理文件。我可能错了,所以请纠正我。我已经将我的控制器更改为:

    public ResponseEntity<Resource> readPhotoById(Long id) {
        Photo photo = photosRepository.findById(id).get();
        return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType(photo.getType()))
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + photo.getName() + "\"")
                .body(new ByteArrayResource(photo.getData()));
    }

现在它按预期工作。

干杯:)