文件标识key?

来源:9-5 分片检查与极速秒传

慕神4535282

2021-03-06

老师,下午好,
本节中,你把

let key = hex_md5(file); 

改为了

let key = hex_md5(file.name + file.size + file.type); 

为此,我提出一点疑问?
如果同一文件更改了文件名后再次上传,那按照上述代码的逻辑,那key会不同样,从而不会触发极速秒传。对吧?
为此,我把upload()改写成这样:

uploadFile () {
        let _this = this;
        let formData = new window.FormData();
        let file = _this.$refs.file.files[0]; 

        console.log(JSON.stringify(file));
        /*
          name: "test.mp4"
          lastModified: 1901173357457
          lastModifiedDate: Tue May 27 2099 14:49:17 GMT+0800 (中国标准时间) {}
          webkitRelativePath: ""
          size: 37415970
          type: "video/mp4"
        */
        
        let fileReader = new FileReader();
        let key10 = {}; // 16进制转换为10进制的数值类型
        let key62 = {};
        // 生成文件标识,标识多次上传的是不是同一个文件
        fileReader.onload = function (e) {
          let base64 = e.target.result; 
          let key = hex_md5(base64); 
          key10 = parseInt(key, 16);
          key62 = Tool._10to62(key10);
          console.log(key, key10, key62);
          console.log(hex_md5(Array()));
        }
        fileReader.readAsDataURL(file);

        /*
          d41d8cd98f00b204e9800998ecf8427e
          2.8194976848941264e+38
          6sfSqfOwzmik4A4icMYuUe
         */

        // 判断文件格式
        let suffixs = _this.suffixs;
        let fileName = file.name;
        let suffix = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length).toLowerCase(); // substring javascript语法
        let validateSuffix = false;
        for (let i = 0; i < suffixs.length; i++) {
          if (suffixs[i].toLowerCase() === suffix) {
            validateSuffix = true;
            break;
          }
        }
        if (!validateSuffix) {
          Toast.warning("文件格式不正确!只支持上传:" + suffixs.join(","));
          $("#" + _this.inputId + "-input").val("");
          return;
        }

        // 文件分片
        let shardSize = 10 * 1024 * 1024;    //以10MB为一个分片
        let shardIndex = 1;   //分片索引,1表示第1个分片
        let size = file.size;
        let shardTotal = Math.ceil(size / shardSize); //总片数

        let param = { //'shard': base64,
          'shardIndex': shardIndex,
          'shardSize': shardSize,
          'shardTotal': shardTotal,
          'use': _this.use,
          'name': file.name,
          'suffix': suffix,
          'size': file.size,
          'key': key62
        };

        _this.check(param);
      },

执行结果出了一大堆错误,见图图片描述

请问老师,上述改写的思路对吗?
还有,为什么程序执行时会先执行big-file.vue 第97行的

console.log("key62:", key62);

然后才执行big-file.vue 第63行的

console.log(key, key10, key62);

麻烦老师指点一下我如何实现同一文件更改了文件名后再次上传后也可以极速上传,(问题有点多且零散,麻烦老师逐一解答)。
谢谢老师!!!

写回答

2回答

甲蛙

2021-03-08

看不到你的行数,也找不到console代码,没法看哪个先输出。

报错是check这个方法有问题,/check/xxx,后面应该是key

你只是想解决文件重命名的问题,那么可以把

let key = hex_md5(file.name + file.size + file.type);

改成不看名称

let key = hex_md5(file.size + file.type);

获者换成最后更新时间,看看file这个对象还有什么属性可以用

0
7
慕神4535282
非常感谢!
2021-03-11
共7条回复

慕神4535282

提问者

2021-03-08

截图:

//img.mukewang.com/szimg/60459d1c092cb07110650750.jpg

//img1.sycdn.imooc.com/szimg/60459d1c097390f513750775.jpg

这是console.log("file:", file);

的输出截图:

//img.mukewang.com/szimg/60459e5c094bba6d05740155.jpg


0
0

Spring Cloud+ Vue前后端分离开发企业级在线视频系统

全网稀缺课程 市场热门项目+主流框架 一课掌握前后端技术

1743 学习 · 1697 问题

查看课程