JS操作二进制方法 - blob

主要总结Blob对象属性及作用,通过DEMO介绍Blob对象的应用场景。

js可以通过blob方法直接操作二进制数据。

Blob 对象表示一个不可变、原始数据的类文件对象。Blob 表示的不一定是JavaScript原生格式的数据。File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。

创建Blob

var blob = new Blob( dataArr:Array, opt:{type:string})

  • dataArray: 数组,包含了要添加到 Blob 对象中的数据,数据可以是任意多个 ArrayBuffer, ArrayBufferView, Blob, 或者 DOMString 对象。
  • opt:对象,用于设置Blob的属性(如: MIME 类型)

1.创建一个DOMString对象的Blob对象

var a="<p>l</p>"
var b = new Blob([a],{type:"text/plain"})
复制代码

2.创建一个装满ArrayBuffer对象的Blob对象

var a=new ArrayBuffer(16)
var b = new Blob([a],{ type:"text/plain"})
复制代码

3.创建一个装满ArrayBufferView对象的Blob对象

var a=new ArrayBuffer(16)
var b = new Int16Array(a)
复制代码

通过url下载文件

  1. 通过createObjectURL
//axios需要添加responseType:'blob'
let blob = new Blob([res.data], {type: "application/vnd.ms-excel"});
let url = window.URL.createObjectURL(blob);
window.location.href = url;
复制代码
  1. 通过插件file-saver
//axios需要添加responseType:'blob'
var blob = new Blob([res.data], {type: "text/plain;charset=utf-8"});
saveAs(blob, "file.txt");
复制代码
createDownload("download.txt","download file");

function createDownload(fileName, content){
    var blob = new Blob([content]);
    var link = document.createElement("a");
    link.innerHTML = fileName;
    link.download = fileName;
    link.href = URL.createObjectURL(blob);
    document.getElementsByTagName("body")[0].appendChild(link);
}
复制代码

从 Blob 中提取数据

  1. readAsText()

readAsText 方法可以将 Blob 或者 File 对象转根据特殊的编码格式转化为内容(字符串形式)

这个方法是异步的,也就是说,只有当执行完成后才能够查看到结果,如果直接查看是无结果的,并返回undefined

也就是说必须要挂载 实例下的 onload 或 onloadend 的方法处理转化后的结果

当转化完成后, readyState 这个参数就会转换 为 done 即完成态, event("loadend") 挂载的事件会被触发,并可以通过事件返回的形参得到中的 FileReader.result 属性得到转化后的结果

// 一个文件上传的回调 <input type="file" onchange="onChange(event)">
function onChange(event) {
  var file = event.target.files[0];
  var reader = new FileReader();
  reader.onload = function(event) {
    // 文件里的文本会在这里被打印出来
    console.log(event.target.result)
  };

  reader.readAsText(file,'UTF-8');
}
复制代码
  1. readAsDataURL()

readAsDataURL 方法会读取指定的 Blob 或 File 对象。读取操作完成的时候,readyState会变成已完成DONE,并触发 loadend 事件,同时 result 属性将包含一个data:URL格式的字符串(base64编码)以表示所读取文件的内容。

//<input type="file" onchange="previewFile()"><br>
//<img src="" height="200" alt="Image preview...">

function previewFile() {
  var preview = document.querySelector('img');
  var file    = document.querySelector('input[type=file]').files[0];
  var reader  = new FileReader();

  reader.addEventListener("load", function () {
    preview.src = reader.result;
  }, false);

  if (file) {
    reader.readAsDataURL(file);
  }
}
复制代码
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二进制流转换为 Excel 文件并下载可以使用以下代码: ```javascript function downloadExcel(data, filename) { // 创建一个 Blob 对象,用于存储 Excel 文件内容 const blob = new Blob([data], { type: 'application/vnd.ms-excel' }); // 创建一个链接,用于下载 Excel 文件 const link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); // 设置链接的下载属性,包括文件名和下载方式 link.download = filename; link.style.display = 'none'; document.body.appendChild(link); // 触发链接的点击事件,开始下载 Excel 文件 link.click(); // 下载完成后移除链接和 Blob 对象 document.body.removeChild(link); window.URL.revokeObjectURL(blob); } // 使用 fetch 方法获取二进制流数据 fetch('http://example.com/data.xlsx') .then(response => response.blob()) .then(blob => { // 将二进制流转换为 ArrayBuffer const reader = new FileReader(); reader.readAsArrayBuffer(blob); reader.onload = () => { const data = new Uint8Array(reader.result); // 下载 Excel 文件 downloadExcel(data, 'data.xlsx'); }; }); ``` 如果你遇到乱码问题,可能是因为 Excel 文件使用了非 UTF-8 编码。你可以尝试使用 `TextDecoder` 对 ArrayBuffer 进行解码: ```javascript const decoder = new TextDecoder('cp936'); // 使用 GBK 编码 const content = decoder.decode(data); const blob = new Blob([content], { type: 'application/vnd.ms-excel' }); ``` 如果使用其他编码,请替换 `cp936` 参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值