• 关于外部无法访问reader.onload内生成值的解决办法


    这两天在写大文件上传时遇到一个需求:要将文件生成SHA1(hash)发送给后台,在使用reader.onload函数时无法将数据保存到该函数外部,尝试网上的办法均无效,今天终于解决了,做个笔记

    需求:给选中的file对象生成hash,标识唯一值

    //生成hash的函数
    // utils.js
    
    // file: 即将上传的file对象
    //由于onload是异步读取的,如果在onload函数体下一行直接console.log是无法读取到值的,这个涉及到事件循环,以后有机会再写
    export function getHash(file) {
      return new Promise(function (resolve, reject) {
        let reader = new FileReader();
        reader.readAsArrayBuffer(file);
        reader.onload = () => {
          let wordArray = CryptoJS.lib.WordArray.create(reader.result);
          let hash = CryptoJS.SHA1(wordArray).toString();
          resolve(hash);
        }
      })
    }
    
    

    外部使用

    //fileUpload.js
    //在要对文件进行操作的地方进行调用这个函数,但是要在原来的函数前使用async/await,同样的原因:onload是异步的
    async  uploadFile(file){
      //其余逻辑忽略
      let hash = "";
      hash = await getHash(file);// 在这里,不要写.then ,直接将getHash赋值给一个变量就行了
      console.log(`hash1111111`, hash); 
    }
    // 
    
    

    一般retrun promise 都需要 async await 等待他完成,一位来自于百度大厂的老师这样告诉我.

    2021年8月1日 今天又看到另一种方法 大同小异,做个笔记(传送门:
    https://blog.csdn.net/youngeffort/article/details/89508646?utm_term=axios的put上传文件&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-1-89508646&spm=3001.4430)

    async Photograph() {
          // 获取用户拍照的图片名字,显示到页面上
          this.fileName = this.$refs.photoref.files[0].name;
          // 获取图片base64 代码,并存放到 base64ImgData 中
          this.base64ImgData = await this.FileReader(this.$refs.photoref.files[0]);
        },
        /**
         * 返回用户拍照图片的base64
         */
        FileReader(FileInfo) {
          // FileReader 方法参考地址:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader
          let reader = new FileReader();
          // readAsDataURL 方法参考地址:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader/readAsDataURL
          reader.readAsDataURL(FileInfo);
          // 监听读取操作结束
          /* eslint-disable */
          return new Promise(
            resolve => (reader.onloadend = () => resolve(reader.result))
          );
        }
     
    
     
    

    写下这篇博文的目的是为了让自己能记得清楚,希望再也不要犯低级的错误了

    以上

    作者:致爱丽丝
    本文版权归作者和博客园共有,欢迎转载,但必须在文章页面给出原文链接并标名原文作者,否则保留追究法律责任的权利。
  • 相关阅读:
    linux查看系统挂载磁盘
    Jenkins REST API 实例
    Python中 __init__.py的作用
    转载:Python中打开文件的方式(With open)
    利用tail -f /dev/null命令防止container启动后退出
    echo -e 命令详解
    Python排序
    Linux操作系统下删除除具体文件或目录之外的文件
    linux pam模块学习
    vsftpd服务器配置
  • 原文地址:https://www.cnblogs.com/hjk1124/p/15084149.html
Copyright © 2020-2023  润新知