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

后端图片数据返回

后端通过二进制流的形式,写入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

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 要使用 Spring Boot 和 Vue 实现登录注册功能,您需要执行以下步骤: 1. 在 Spring Boot 中创建 RESTful API 接口,实现用户登录和注册功能。 2. 使用 Vue 前端框架创建登录和注册页面。 3. 在 Vue 中使用 axios 库发送 HTTP 请求到 Spring Boot 接口,以实现用户的登录和注册功能。 4. 在 Spring Boot 中使用数据库存储用户的注册信息,并在登录时验证用户的身份。 5. 在登录成功后,在 Vue 前端保存用户的登录状态,以便允许用户访问需要登录的页面。 这些步骤的详细实现方法将因您的具体需求和环境而异,建议您在网上查找相关教程学习。 ### 回答2: 使用Spring Boot和Vue实现登录注册功能,可以通过以下步骤实现: 1. 后端使用Spring Boot搭建一个RESTful API,处理用户的登录和注册请求。可以使用Spring Security来实现用户认证和授权功能,确保只有经过认证的用户才能登录。可以使用Spring Data JPA来管理数据库连接和操作。 2. 前端使用Vue搭建用户界面,通过Vue Router来管理页面的跳转。可以通过Vue的单文件组件(.vue)来定义登录和注册页面的布局和交互。可以使用Element UI或者其他UI库来美化界面,并提供用户友好的输入框、按钮等组件。 3. 在登录页面,用户输入用户名和密码,点击登录按钮。前端通过Axios或者Fetch等工具发送POST请求到后端的登录API,携带用户名和密码。后端验证用户名和密码的正确性,如果验证通过,返回一个包含用户信息和一个身份验证令牌(token)的响应。 4. 前端接收到登录响应后,可以将用户信息保存到浏览器的本地存储(LocalStorage或SessionStorage),同时将身份验证令牌保存到浏览器的Cookie中,以便后续的请求可以携带该令牌进行身份验证。 5. 在注册页面,用户输入用户名和密码,并确认密码,点击注册按钮。前端通过Axios或者Fetch等工具发送POST请求到后端的注册API,携带用户名和密码。后端验证用户名的唯一性,如果用户名可用,将用户信息保存到数据库,并返回一个注册成功的响应。 6. 前端接收到注册响应后,可以跳转到登录页面,提示用户注册成功并自动填充用户名到登录表单中,以方便用户直接登录。 通过以上步骤,就可以实现使用Spring Boot和Vue来实现登录注册功能。该方案既保证了后端的安全性和可扩展性,又提供了良好的用户界面和交互体验。 ### 回答3: 使用Spring Boot和Vue实现登录注册功能可以分为以下几个步骤: 第一步是搭建后端框架,使用Spring Boot来构建后端应用。可以使用Spring Security来处理用户认证和授权的相关功能。在Spring Boot中配置数据库连接和数据表,用于存储用户的账号和密码等信息。 第二步是搭建前端框架,使用Vue来构建前端应用。可以使用Vue Router来处理不同页面之间的路由跳转。在前端页面上设计登录和注册的表单,并通过Ajax或者axios等工具将用户的输入发送给后端进行处理。 第三步是定义后端的API接口,用于处理前端页面发送的请求。可以使用Spring Boot的@RestController注解来定义Controller层,并通过@RequestMapping注解来定义接口的URL地址。在登录接口中,将用户输入的账号和密码进行校验,并返回登录成功或者失败的结果。在注册接口中,将用户输入的账号和密码保存到数据库中。 第四步是在前端页面中调用后端的API接口,发送登录和注册的请求。可以使用Axios或者Vue Resource等HTTP库来发送请求,并处理返回的结果。在登录成功后,可以将用户信息保存到本地的LocalStorage中,并跳转到登录后的页面。在注册成功后,可以跳转到登录页面。 第五步是对登录状态进行管理,可以使用Vuex或者LocalStorage来保存用户的登录状态。在页面刷新时,可以通过从LocalStorage中读取用户信息,并更新到Vuex中来保持用户的登录状态。 综上所述,通过使用Spring Boot和Vue,可以实现一个简单的登录注册功能。后端处理用户的登录和注册请求,并将结果返回前端前端页面通过调用后端的API接口来发送请求,并根据返回的结果进行相应的处理。这样就实现了基本的登录注册功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值