将后台二进制数据转换为blob,并转换为 src="blob:http://" 链接

本文介绍如何将后台获取的二进制数据转换为blob对象,并进一步转化为`src="blob:http://"`的链接。通过Node.js的Express处理二进制数据,然后在前端利用Ajax进行转换操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

后台code

使用express 搭建的后台

// 加载 express
const express = require('express')
// 加载 fs
const fs = require('fs')
// 创建 app
const app = express()
// 静态文件托管
app.use(express.static('public'))
// 主页面请求
app.get('/', function(req, res) {
  res.sendFile(__dirname + '/index.html')
})
app.post('/url', function(req, res) {
  // 读取文件
  fs.readFile(__dirname + '/public/test.mp4', function(err, data) {
    if (err) {
      console.log(err.stack)
      return
    }
    // 向前台发送二进制数据
    res.send(data)
    res.end()
  })
})
app.listen(8080, function() {
  console.log('Server is running……')
})

前台code:

'use strict'
window.onload = function (evt) {
  // 获取元素
  let video = document.querySelector('.video')
  const xhr = new XMLHttpRequest()
  xhr.open('post', '/url', true)
  // 请求类型 bufffer
  xhr.responseType = 'arraybuffer'
  xhr.onload = function () {
    if (xhr.status === 200 || xhr.status === 304) {
      // 将后台 buffer 转换为 blob
      let blob = new Blob([xhr.response], {type: 'video/*'})
      // 创建blob链接
      video.src = URL.createObjectURL(blob)
    }
  }
  xhr.send()
}

结果:


### 处理后端返回的二进制显示为图片 为了在前端正确处理来自后端系统的二进制将这些数据作为图片显示,可以采用多种方法来完成这一目标。以下是几种常见的方式: #### 方法一:使用 `Blob` 对象创建对象 URL 显示图片 通过设置 XMLHttpRequest 的响应类型为 blob 来接收服务器传来的二进制数据,利用 JavaScript 中的 `URL.createObjectURL()` 函数生成临时的对象 URL 用于 `<img>` 标签加载。 ```javascript fetch('/api/getImage') .then(response => response.blob()) .then(blob => { const imageUrl = URL.createObjectURL(blob); document.getElementById('image').src = imageUrl; }); ``` 这种方法简单高效,适合大多数情况下的图片展示需求[^2]。 #### 方法二:Base64 编码方式转换数组缓冲区到 Base64 字符串再嵌入 HTML 页面 对于某些特定场景下可能更倾向于直接操作原始字节序列,则可以通过先将 ArrayBuffer 转换成 base64 编码字符串的形式,之后拼接到 data URI scheme 前缀后面形成完整的 src 属性值供 img 元素解析渲染图像内容。 ```javascript apis['getCaptcha'](data).then(res => { let imgurl = "data:image/jpeg;base64," + btoa( new Uint8Array(res).reduce((res, byte) => res + String.fromCharCode(byte), "") ); codeImg.value = imgurl; }); ``` 此方案虽然增加了额外计算开销但是能够更好地兼容不同浏览器环境且便于调试查看实际传输过来的内容是什么样子[^3]。 #### 方法三:Vue 组件内集成图片预览功能 如果项目基于 Vue.js 构建的话还可以考虑封装成组件形式方便复用逻辑代码。下面是一个简单的例子展示了如何在一个 el-image 组件里动态绑定由 API 请求获得的新鲜出炉的照片链接! ```html <template> <div class="example"> <!-- 使用 element-ui 提供的 image 组件 --> <el-image :src="imgUrl" fit="fill"></el-image> </div> </template> <script> export default { name: 'ExampleComponent', data() { return { imgUrl: '' }; }, methods: { async fetchAndDisplayImage() { try { const res = await viewContractTypePdf(this.baseInfo.talentId); // 替换为自己的 api 调用函数 this.imgUrl = window.URL.createObjectURL(res); } catch (error) { console.error(error.message || error); } } }, mounted(){ this.fetchAndDisplayImage(); } }; </script> ``` 上述三种技术手段各有优劣之处,在具体应用过程中可以根据实际情况灵活选用最合适的解决方案[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值