后端返回图片,前端接收并显示的解决方案

这篇具有很好参考价值的文章主要介绍了后端返回图片,前端接收并显示的解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

后端图片数据返回

后端通过二进制流的形式,写入response中

controller层

    /**
     * 获取签到二维码
     */
    @GetMapping("/sign-up-pict")
    public void signUpPict(Long id, Long semId, HttpServletResponse response) throws NoSuchAlgorithmException {
        signUpService.getImage(id, semId, response);
    }

service层

/**
     * 返回二维码
     *
     * @param id    教师id
     * @param semId 课程id
     * @param response
     * @return
     */
    @Override
    public void getImage(Long id, Long semId, HttpServletResponse response) throws NoSuchAlgorithmException {
        
		// 保存生成的二维码图片
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 业务逻辑, 全部忽略删除了...
        
        // 设置返回数据类型
        response.setContentType("image/png");

        
        try {
        	// 将图片数据写入out中
            OutputStream out = response.getOutputStream();
            // 将图片数据写入out中, 返回前端
            ImageIO.write(image, "png", out);
            out.close();
        }catch (IOException e) {
            throw new RRException(ErrorCode.IMAGE_GENERATE_FAILED);
        }
    }

前端axios接受数据

axios接受数据时,responseType 默认返回数据类型是 json,必须将其改为返回数据类型 blob。否则axois无法正确解析数据。
这里的http.request是对axios的封装,把他当作axios用就行

return http.request<R<any>>(
    "get",
    signModuleUrlApi(`/signup/sign-up-pict?id=${id}&semId=${semId}`),
    // 一定要加, 否则axios会把二进制数据处理为json
    {
      responseType: "blob"
    }
  );

vue界面渲染

<template>
	<!-- 忽略其它部分代码, 下面这货显示图片-->
	<el-image :src="url" lazy />
<\template>

<script>
	const url = ref();

	// 发送请求
    signApi.signUpPict(id, semId.value).then(
    	res => {
      		const blob = new Blob([res], { type: "image/png" });
      		// 创建URL对象
      		url.value = URL.createObjectURL(blob);
    	},
    	error => {
      		console.log(error);
      		ElMessage.error("系统错误, 无法生成二维码");
    	});
	};
<\script>

注意事项

  1. 后端接口,最好不要有返回值,如果你设置了response.setContentType(“image/png”),很有可能在返回数据的时候出现序列化错误的bug
  2. 后端接口,最好对response的contentType设置一下,不然容易出现一些奇怪的bug
  3. 前端axios一定要设置responseType: “blob”,否则axios会把数据当成json处理

学习文章

https://zhuanlan.zhihu.com/p/474173086
https://www.jianshu.com/p/12fea9987c2d文章来源地址https://www.toymoban.com/news/detail-656785.html

到了这里,关于后端返回图片,前端接收并显示的解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图片上传流程&前端上传文件&后端保存文件&并返回图片地址

    也是在最近一点时间写小demo 遇到的一些问题 比如在用户界面,用户选择本地的一张照片,前端把照片传到后端,后端怎么把照片保存到服务器,然后返回给 图片线上地址。也是找了一些文章,然后分享下。  技术 前端:react 后端:egg.js(node框架) base64 转换  转二进制 保存

    2024年02月02日
    浏览(76)
  • 后端如何返回一个(图片)文件流,并在前端vue展示。

    后端部分可分为三步: 1,获取文件参数(非必须,根据自己情况添加) 2,获取文件 3,以流形式返回 具体代码如下: 前端展示部分。 1,首先在你的axios接口上添加 responseType:\\\'blob\\\' ,以表示你将以blob形式接收(必须添加)。 2,拿到接口返回值后,将其转为blob形式 此时打

    2024年02月11日
    浏览(63)
  • SpringBoot+Vue项目中遇到Not allowed to load local resource图片路径问题的两种解决方案(在后端映射本地路径或将图片转base64返回给前端)

    后端映射本地路径 转base64格式返回 如果是少量图片可以这么操作,不然图片多的话返回base64由于字符太长,传输速度很慢,会导致卡顿现象、加载慢、加载异常等情况出现。 图片转base64 base64转图片保存 headPhotoPath = “D:yangleProjectImageLocationheadPhoto” userPhotoPath = “nologin”

    2024年02月06日
    浏览(50)
  • 微信小程序将后端返回的图片文件流解析显示到页面

    由于请求接口后端返回的图片格式不是一个完整的url,也不是其他直接能显示的图片格式,是一张图片 后端根据模板与二维码生成图片,返回二进制数据 返回为文件流的格式,用wx.request请求的时候,就自动解码成为了下面这样的数据数据格式,这样的数据没有办法直接赋值给ur

    2024年02月02日
    浏览(54)
  • vue 后端返回二进制流-前端通过blob对象下载文件-图片

    前言 在实际开发中我们经常会遇见下载文件的场景,比如下载合同,下载文件 下载文件有2种方式,一种是后端返回二进制流,前端通过blob对象接受根据不同类型下载 还有一种把地址直接在浏览器新窗口打开浏览器打开pdf可以预览和下载,其他文件直接下载 但不管是那种方

    2024年02月05日
    浏览(81)
  • 后端返回二进制流,前端处理二进制文件流,实现预览图片以及PDF

    1、首先预览PDF需要 后端 将响应头 Content-Type 设置为PDF类型 application/pdf ,不能预览,会直接下载 2、 前端 定义接口:并设置相应类型 responseType 为 blob 请求数据:通过 window.URL.createObjectURL(res) 转成本地预览地址, 在通过 window.open() 方法打开转成本地预览地址即可预览PDF,如下

    2024年02月15日
    浏览(58)
  • 前端接收后端传的文件流并下载解决乱码问题

    两种情况: 1.如果这个接口是get的请求: 后端返回文件流,前端可能会导出txt或者excel的时候,里面的中文会出现乱码 就可以直接通过以下方式直接下载: window.location.href = \\\"请求文件流的接口地址\\\" 2.如果这个接口是post的请求:         因为存在多种场景,可能需要通过

    2024年02月11日
    浏览(47)
  • js修改img的src属性显示变换图片到前端页面,img的src属性显示java后台读取返回的本地图片

    img的src属性是前端用来显示一张图片的来源,一般情况下src最常见是显示项目中resourcesstatic问价夹下的图片,或者显示公网上的图片,如果想要在前端显示本地图片那要怎么处理呢?如果直接用本地图片的地址(例如src=“D:Userstest.jpg”)前端是无法显示的。 img 是空标签,它

    2024年02月14日
    浏览(58)
  • 解决:Java后端返回给前端的Date格式数据相差8小时的问题

    问题描述: 后端得到的数据是对的,但是返回给前端后,数据比原数据慢了8小时。 原因: json数据在返回浏览器端是会被spring-boot默认的Jackson框架转换,而Jackson框架默认的时区GMT(相对于中国是少了8小时)。 解决: 在application.yml文件中,配置

    2024年04月16日
    浏览(64)
  • SpringBoot返回前端Long类型字段丢失精度问题及解决方案

    Java服务端返回Long整型数据给前端,JS会自动转换为Number类型。而Long类型能表示的最大值为(),当数值超过JS中Number类型的最大值()时,就会丢失精度。 首先,引入依赖。 新建一个自定义大数据序列化类,如下: 新建Jackson配置类 本文针对Java服务端返回Long整型数据给前端时

    2024年03月22日
    浏览(105)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包