oss上传

文件上传

async handleDrop(event) {
   // drop
   console.log("event", event);
   // console.log(event.dataTransfer.items, '文件上传')
   this.MessagePrompt('文件上传中', 'success');
   this.dragTag = 0;
   event.preventDefault();
   this.isDragging = false;

   const items = event.dataTransfer.items;
   let singles = [],
     count = 0,
     length = items.length;
   for (let i = 0; i < items.length; i++) {
     const item = items[i];
     console.log("item----", item);
     const entry = item.webkitGetAsEntry();
     console.log("eventData", entry);
     if (entry.isDirectory) {
       // 文件夹上传
       console.log('文件夹上传')
       this.uploadFilesRecursive(entry);
     } else {
       // 文件上传
       entry.file((file) => {
         count++;
         console.log("singles", file, singles, count, length);
         singles.push(file);
         if (count == length) {
           this.isCompert(singles)
         }
       });
     }
   }
 },

文件夹读取

async uploadFilesRecursive(entry) {
      let $this = this;
      function getFileData(items) {
        const handle = (list) => {
          const promiseAll = list.map((entry) =>
            entry.isDirectory ? fn(entry) : getFile(entry)
          );
          return Promise.all(promiseAll);
        };
        const fn = (fileSystemEntry) => {
          const reader = fileSystemEntry.createReader();
          return new Promise((res) => {
            reader.readEntries((result) => {
              if (result.length == 0) {
                let name = fileSystemEntry.fullPath.slice(1);
                let fileData = new File([fileSystemEntry], name, { type: "Folder" });

                res(fileData);
              } else {
                let resultFile = result.filter((f) => {
                  if (checkFileName(f.name)) return f;
                  return null;
                });
                if (resultFile.length == 0) {
                  let name = fileSystemEntry.fullPath.slice(1);
                  let fileData = new File([fileSystemEntry], name, { type: "Folder" });

                  res(fileData);
                }

                res(handle(resultFile));
              }
            });
          });
        };
        return handle(items);
      }
      function getFile(entry) {
        if (!checkFileName(entry.name)) return "";
        return new Promise((resolve, reject) => {
          entry.file(
            (file) => {
              let name = entry.fullPath.slice(1);
              let fileData = new File([file], name, {
                type: file.type,
                webkitRelativePath: name,
              });

              resolve(fileData);
            },
            (err) => {
              reject(err);
            }
          );
        });
      }

      // 过滤特殊字符的文件名
      let filterArray = ["._", "~$", ".~"];
      function checkFileName(fileName) {
        if (
          filterArray.filter((f) => {
            if (fileName.startsWith(f)) return f;
          }).length > 0
        )
          return false;
        if (fileName == ".DS_Store") return false;
        return true;
      }

      function flatten(arr) {
        return arr.reduce(
          (acc, val) => (Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val)),
          []
        );
      }

      let list = await getFileData([entry]);

      list = flatten(list);
      list = list.reverse();
      let filterList = list.filter((f) => {
        if (f != "") return f;
      });
      console.log("files", list);

      if (filterList.length == 0) return;
      // 将数据分成每组1000条
      function chunkArray(array, chunkSize) {
        const result = [];
        for (let i = 0; i < array.length; i += chunkSize) {
          result.push(array.slice(i, i + chunkSize));
        }
        return result;
      }
      // 将数据拆分成每组1000条
      const chunks = chunkArray(filterList, 1000);
      console.log("chunks", chunks);
      // 发送请求
      // $this.isCompert(list);
    },

判断文件是否重复

    async isCompert(files) {
      // console.log(files, '接受的文件')
      let $this = this;
      $this.compertFlag = false
      let list = files;
      let nameList = files.map(item => {
        if (item.webkitRelativePath) {
          return {
            name: "/" + item.webkitRelativePath,
            size: item.size
          }
        } else {
          return {
            name: "/" + item.name,
            size: item.size
          }
        }
      })
      let data = {
        FileName: '',
        ProjectId: this.params.ProjectId,
        ProIdentityid: this.params.ProjectIdentityId,
        ParentId: this.params.ParentId,
        Size: ''
      }
      console.log(nameList, data, this.params, 'nameList')
      for (let i = 0; i < nameList.length; i++) {
        console.log(i, '一步了嘛')
        data.FileName = nameList[i].name
        data.Size = nameList[i].size
        const res = await checkProjectfile(data)
        console.log(res, '请求结果')
        if (res.code == 200) {
          let flag
          if (res.data.FileId) {
            obj.fileId = res.data.FileId
            flag = true
          }
          if (flag) {
            // 如果有重名的
            $this.compertShow = true;
            $this.compertKeepList = list[i];
          } else {
            // 不重名
            $this.pushFile(list[i])
            $this.isUploading = true;
            if ($this.allDone) {
              $this.newUpdate($this.upLoadingFiles)
            }
          }
        } else {
          $this.MessagePrompt(res.message, 'error');
        }
      }
    },

添加上传列表

   //往上传列表添加文件
    async pushFile(list, flag) {
      console.log(list, '获取list')
      const data = {}
      //  const res = await getProjectfileToken()
      if (res.code == 200) {
        const client = new OSS({
          // yourRegion填写Bucket所在地域。Region填写为oss-cn-hangzhou。
          // region: "oss-cn-beijing", //我的存储是北京,可根据具体配置自行修改
          region: 'oss-cn-shanghai',
          // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。)(后台接口返回)
          accessKeyId: res.accessKeyId,
          accessKeySecret: res.accessKeySecret,
          // 从STS服务获取的安全令牌(SecurityToken)。
          stsToken: res.securityToken,
          // 填写Bucket名称。
          bucket: 'zzl-filerepostorypublic',
          endpoint: "https://oss-cn-shanghai.aliyuncs.com"
        })
        client().multipartUpload(fileName, file, {}).then(res => {
          console.log(res)
        })
      }
      //获取凭证

    },
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容