用fileReader.readAsBinaryString读取的文件,重新下载后会无法打开

题目描述

就是文件要上传时用fileReader.readAsBinaryString读取为二进制,再把这它保存为Blob文件并下载这个操作,对于像图片,压缩文件等文件,重新下载后的文件会无法打开(.txt文件能够正确打开),有大神知道这是什么原因吗?

相关代码

<el-upload
    id='upload'
    class="file-field input-field"
    drag
    action="123"
    :before-upload="beforeUpload"
    :headers="header"
    multiple>
    <i class="el-icon-upload"></i>
    <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
    <div class="el-upload__tip" slot="tip">上传文件,且不超过10Mb</div>
    </el-upload>
beforeUpload (file) {
      // let vm = this
      let fileReader = new FileReader()
      fileReader.readAsBinaryString(file)
      fileReader.onload = function (e) {
      
        let downloadFile = new Blob([e.target.result])
        let url = window.URL.createObjectURL(downloadFile)
        let link = document.createElement('a')
        link.style.display = 'none'
        link.href = url
        link.setAttribute(
          'download',
          file.name
        )
        document.body.appendChild(link)
        link.click()
      }
      return false
    },
阅读 4.5k
3 个回答

content-type 没了吧。传个 type

image.png

image.png


更新时间: 2020年4月20日10:01:56

可以看到通过你的方法。出来的大小都不一样了。所以应是 toBlob 的时候转换有问题。

https://www.lilnong.top/stati...

imgFile = file.files[0];
console.log(imgFile)
file2binaryStirng(imgFile).then(console.log)
file2binaryStirng(imgFile).then(binaryStirng2file).then(console.log)

image.png

Binary strings 不是JavaScript 语言的设计。 然而至少有一个native 函数以它作为输入 ,比如btoa()  从 String 对象中创建一个 base-64 编码的 ASCII 字符串,其中字符串中的每个字符都被视为一个二进制数据字节。"): 给这个函数传入charcode 大于255 的字符串会抛出一个 Character Out Of Range 的错误。

引入Binary strings来代表uint8 数字的原因是由于 web 应用变得越来越强大(比如操作音频和视频, 使用WebSockets获取二进制数据, 等等)很明显,有一种可以让JavaScript可以简单而快速地操作二进制数据的api 将会提供很大的帮助。

在以前, 操作二进制数据必须通过对字符串的操作来模拟。使用 charCodeAt() 方法从Binary strings读取数据. 然而这么做又慢又容易出错, 因为需要多次转换(尤其是当数据不是真正的 byte-format data,而是 32-bit 整数或者浮点数)

你这要是只要上传单文件,且不想用 FormData,那么可以直接把 file 对象传入 XMLHttpRequest.send 中,也可以直接传入 axios.post 中,不用做其他封装,当然,也可以用new Blob([e.target.result], { type: file.type });封装一下。

今天上传就遇到你的问题,上传后的压缩包变大了很多,重新下载回来,解压不了了,后来把fileReader去掉就好了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题