js 文件,流操作的几个概念

1 File,Blob

        File对象就是我们input 的change事件,或者Drop&Drag的evt.dataTransfer.files属性能够拿到的对象,基本上代表了一个实体文件,它实际上继承自Blob,它拥有Blob的所有功能的同时扩展了一系列关于文件的属性。拿到File之后我们通常有两种用途,1上传,2读取。上传很简单,通过formData可以上传,或者转成base64string上传。

        如果要读取,那么就涉及到文件读取操作,字符文件或者字节文件时不一样的,字符文件还有一个编码问题。我们分开讨论。

2 Blob的读取(文件读取,上传)

         fileReader.readAsText(blob)
         fileReader.readAsDataURL(blob)
         readAsArrayBuffer(blob)

        这三个方法就是用来读取blob的主要方法了,text很好理解,按utf8读字符串,dataUrl就是读成base64的字符串('data:image/png;base64,xxdfsfsdfkkkll格式),很多api操作时是支持使用的,比如pdf读取。那么readAsArrayBuffer又是拿来干嘛的呢,这就是js版的字节数组ByteArray对象了,可以直接读成一个内存中的字节数组,然后再对这个对象进行操作。

3 ArrayBuffer

        ArrayBuffer & TypedArray 都是内存字节流的概念,具体而言,ArrayBuffer是TypedArray的包装类,TypedArray是实际工作的数据类型,实际是一个number形的数组,拿到它以后可以对他进行修改,或者交给其他api使用。

        blob可以从readAsArrayBuffer转化为ArrayBuffer,ArrayBuffer也可以转化为Blob,而且很简单,听过构造函数即可。

        var aBlob = new Blob( array, options );

        array 是一个由ArrayBuffer, TypedArray , Blob, string 等对象构成的 Array ,或者其他类似对象的混合体,它将会被放进 Blob。DOMStrings 会被编码为 UTF-8。
        options 是一个可选的BlobPropertyBag字典,它可能会指定如下两个属性:
        type,默认值为 "",它代表了将会被放入到 blob 中的数组内容的 MIME 类型。
        endings,默认值为"transparent",用于指定包含行结束符\n的字符串如何被写入。它是以下两个值中的一个:"native",代表行结束符会被更改为适合宿主操作系统文件系统的换行符,或者 "transparent",代表会保持 blob 中保存的结束符不变。

4 内存构造文件,下载

        当我们在内存构造了一个csv字符串,怎么让浏览器下载呢?

        答案是转成Blob对象下载,还记得Blob需要的三种类型么,如果是单纯的文本呢类型比如csv,text,那么很简单,直接传文本就是了。但是如果要输出一个pdf,图片,或者指定日文编码的csv文件,那么怎么办呢?这个时候就需要我们的ArrayBuffer & TypedArray对象了。

        只要拿到这个字节数组转成Blob,然后就可以通过window.URL.createObjectURL(blob)方法进行下载了。类似这样:

      var a = document.createElement('a');
      a.download = file_name;
      a.target = '_blank';
      a.href = window.URL.createObjectURL(blob);
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);

 5 实例,固定编码的CSV文件。

        首先我们有一个构造好的csv字符串,想要转化为日文的SJIS编码。我们需要用到encoding.js:

        {string} Encoding.codeToString ( {Array|TypedArray} data )

        {Array} Encoding.stringToCode ( {string} string )

        {Array|TypedArray|string} Encoding.convert ( data, to_encoding [, from_encoding ] )

这几个方法可以实现js版本的字符编码操作。类似这样:

  toSJIS(str: string, type: encoding.ConvertOptions["type"] = "array") {
    return encoding.convert(encoding.stringToCode(str), {
      to: 'SJIS',
      from: 'UTF8',
      type: type,
    })
  }

  downloadFile(data_file: string, file_name: string) {
    let byteArray = this.toSJIS(data_file, "arraybuffer") as ArrayBuffer;
    let blob = new Blob([byteArray], { "type": "application/octet-stream" });
    // IE
    if (window.navigator.msSaveBlob) {
      window.navigator.msSaveBlob(blob, file_name);
    }
    // Firefox chrome
    else if (window.URL && window.URL.createObjectURL) {
      var a = document.createElement('a');
      a.download = file_name;
      a.target = '_blank';
      a.href = window.URL.createObjectURL(blob);
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
    }
  }

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值