vue和js分别处理后台传过来的图片流在前端img的src中展示

参考网址:

1、https://www.jianshu.com/p/1432e0f29abd  总的14.3/

2、https://blackstar.coding.me/2018-08-23-arraybuffer-to-base64orblob.html

 

3、https://blog.csdn.net/dongxingpeng/article/details/83143977 此网站下的数据交互基于axios

 

次博客的栗子基于superagent

一开始我接受打印出来的text是乱码

原因是在数据请求的时候返回的respon是json的形式,而后台返回的流(我理解的就是二进制的图片)。这样的话我们在请求接口的时候就要定义一下   .responseType:arraybuffer

(一:vue)

html:

<span class="code-img" @click="refreshCode">
     <img class="code-img-box" :src="codeImg" alt="">
</span>

script:

var request = require('superagent');

data(){
            return{
                codeImg:'', 
            }
        },
menthods:{
refreshCode(){
  // console.info('刷新获取验证码');
    request 
        .post('/api/pet........')
        .send()
        .responseType('arraybuffer')
        .then((res)=>{ 
const bufferUrl = btoa(new Uint8Array(res.body).reduce((body, byte) => body + String.fromCharCode(byte), ''));
             this.codeImg = 'data:image/png;base64,' + bufferUrl
         })
         .catch((err)=>{
              console.log(err)
         })

}
}
 

二、js写法

//刷新获取图片验证码
function getImgCode() {
var imgUrl = event.target.src;
   // console.log(event.target.src);
   var imgUrl = event.target.src;
   var xmlhttp;
   if (window.XMLHttpRequest) {
       //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
       xmlhttp = new XMLHttpRequest();
    } else {
     // IE6, IE5 浏览器执行代码
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
 
    // 请求成功回调函数
    xmlhttp.onload = e => {
      // console.log('request success');
    };
   // 请求结束
   xmlhttp.onloadend = e => {
      // console.log('request loadend');
   };
   // 请求出错
  xmlhttp.onerror = e => {
      // console.log('request error');
  };
   // 请求超时
  xmlhttp.ontimeout = e => {
     // console.log('request timeout');
  };
 
  xmlhttp.timeout = 0; // 设置超时时间,0表示永不超时
  // 初始化请求
  // http://rap.qdum.com/mockjsdata/43/submitForm/?id
 xmlhttp.open('POST', 'http://19............', true);
 // 设置期望的返回数据类型 'arraybuffer'
 xmlhttp.responseType = 'arraybuffer';
 // 设置请求头
 // xmlhttp.setRequestHeader('', '');
 // 发送请求
xmlhttp.send();
xmlhttp.onreadystatechange = function () {
   if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
       // console.log(xmlhttp)
      console.info(xmlhttp.response);
   var bufferUrl = btoa(new Uint8Array(xmlhttp.response).reduce((response, byte) => 
response + String.fromCharCode(byte), ''));
    console.log('data:image/png;base64,' + bufferUrl)
//event.target.src = 'data:image/png;base64,' + bufferUrl;
//event.target.src 的指向不对  所以img的src付不上值,更换成imnUrl,imgUrl在函数前面赋值
    imgUrl = 'data:image/png;base64,' + bufferUrl;
    console.log(event.target.src)
}
}
}

这里要注意  在页面中赋值img的src仍然是unkonw

因为在这里 event.target的指向是不对的 没有穿透 所以要加两句代码 

1、再函数前面定义 var imgUrl =  event.target.src 

2、“event.target.src = 'data:image/png;base64,' + bufferUrl;”改成“imgUrl = 'data:image/png;base64,' + bufferUrl;”。

我的问题解决。

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例,使用Vue.js和Spring Boot从后端获取图像并在前端显示: #### 后端代码 在Spring Boot,您需要创建一个RESTful API来提供图像数据。以下是一个简单的示例: ```java @RestController @RequestMapping("/api/images") public class ImageController { @Autowired private ImageService imageService; @GetMapping("/{id}") public ResponseEntity<byte[]> getImage(@PathVariable Long id) { Image image = imageService.getImageById(id); if (image == null) { return ResponseEntity.notFound().build(); } return ResponseEntity.ok().contentType(MediaType.IMAGE_JPEG).body(image.getData()); } } ``` 此控制器使用`ImageService`从数据库获取图像数据,并将其作为`byte[]`返回。请注意,我们在响应头设置了`Content-Type`为`image/jpeg`,以确保浏览器正确解析图像数据。 #### 前端代码 在Vue.js,您可以使用`axios`库从后端获取图像数据,并使用`<img>`标签在前端显示它。以下是一个简单的示例: ```html <template> <div> <img :src="imageUrl"> </div> </template> <script> import axios from 'axios'; export default { data() { return { imageUrl: '' }; }, created() { axios.get('/api/images/1', { responseType: 'arraybuffer' }) .then(response => { const imageBlob = new Blob([response.data], { type: 'image/jpeg' }); this.imageUrl = URL.createObjectURL(imageBlob); }) .catch(error => { console.log(error); }); } }; </script> ``` 在此示例,我们使用`axios`从`/api/images/1`端点获取图像数据。请注意,我们将`responseType`设置为`arraybuffer`,以便正确处理二进制图像数据。 一旦我们获得了响应,我们将其转换为`Blob`对象,并使用`URL.createObjectURL()`方法创建图像的URL。然后,我们可以将其分配给`<img>`标签的`src`属性,以在前端显示图像。 #### 总结 这只是一个简单的示例,您可能需要根据您的具体需求进行修改。但是,这应该为您提供了一个基本的框架来从后端获取图像并在前端显示它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值