前端如何渲染图片流到页面

需求

后端要返回一个图片流,这个流在浏览器访问是可以预览的状态,然后前端拿到流之后需要将这个图片展示出来。前端必须要使用ajax的POST请求,因为传递的参数比较多,而且还需要token权限校验逻辑,所以必须要POST请求,不能用GET请求。这个需求其实上也很常见,下面开看下如何实现的。

重点

后端没什么可说的,就是返回图片流即可。重点是前端如何将流给渲染出来。需要用到Blob这个对象。

如何实现

后端实现

package com.example.bootdemo;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
@CrossOrigin(origins = "*")
@RestController
public class ImageController {

    @RequestMapping(value = "/xx", method = RequestMethod.GET)
    public void getImageAsByteArray(HttpServletResponse response) throws IOException {
        //获取下载文件的输入流
        InputStream in = new FileInputStream("C:\Users\Think\Desktop\1.png");
        response.setContentType(MediaType.IMAGE_JPEG_VALUE);
        //加上就是下载 否则就是预览
        String returnName = URLEncoder.encode("图片名字""UTF-8");
        response.addHeader("Content-Disposition","attachment;filename="+new String(returnName.getBytes("ISO8859-1")));
        //创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
        //获取OutputStream对象
        ServletOutputStream out = response.getOutputStream();
        //将FileInputStream流写入到buffer缓冲区中,使用OutputStream流将缓冲区的数据输出到客户端
        while ((len = in.read(buffer)) > 0){
            out.write(buffer,0,len);
        }
        in.close();
        out.close();
    }
}

前端实现

这里面我使用的是axios对象实现的ajax请求。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Axios请求示例</title>
    <!-- 引入 axios -->
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script>
        // 这个函数在页面加载后执行
        window.onload = function({
            // 使用axios发出GET请求
            axios.get('http://127.0.0.1:8080/xx',{ responseType'blob' })
                .then(function (response{
                    // 请求成功时的处理
                    console.log(response.data); // 在控制台输出响应数据
                     // codeFile 接口返回结果
                    const blob = new Blob([response.data])
                    const url = window.URL.createObjectURL(blob)
                    var img=document.getElementById("xx");
                    img.setAttribute("src",url);
                  })
                .catch(function (error{
                    // 请求失败时的处理
                    console.error('请求失败:', error);
                });
        }
    
</script>
</head>
<body>
    <h1>API数据</h1>
    <div id="api-response">
        API请求图片结果将显示在这里
        <img id="xx" src="" alt="">
    </div>
</body>
</html>

结果展示

前端如何渲染图片流到页面


如果这篇文章对您有帮助,希望能有一键三连。点赞,在看,转发~

原文始发于微信公众号(干货食堂):前端如何渲染图片流到页面

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/258500.html

(0)
葫芦侠五楼的头像葫芦侠五楼

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!