vue3拖拽文件或者文件夹(获取文件夹下面的所有文件)

96 阅读1分钟

因为用的webkitGetAsEntry,所以只有用谷歌内核的才可以,Safari不行

先将基础的搭好再写js

template:

<template>
  <div class="hello" @dragover.prevent @drop="handleDrop">

  </div>
</template>

style:

<style scoped lang="scss">
.hello {
  width: 300px;
  height: 300px;
  border: 1px solid #ccc;
  padding: 10px;
}
</style>

JavaScript

<script  setup>
import { ref } from 'vue';
const dragUploadConfirmFile = ref([]);
function handleDrop(event) {
  event.preventDefault();
  if (event.dataTransfer) {
    let items = event.dataTransfer.items;
    for (let i = 0; i <= items.length - 1; i++) {
      let item = items[i];
      if (item.kind === "file") {
        let entry = item.webkitGetAsEntry();
        getFileFromEntryRecursively(entry);
      }
    }
  }

}
function submit() {
  console.log(dragUploadConfirmFile.value);
}
const timer = ref()
function toDragUploadConfirmFile(file) {
  dragUploadConfirmFile.value.push(file);
  if (timer.value) {
    clearTimeout(timer.value);
    timer.value = null;
  }
  timer.value = setTimeout(() => {
    submit()
  }, 700);
}
function getFileFromEntryRecursively(entry) {
  if (entry.isFile) {
    entry.file(function (file) {
      toDragUploadConfirmFile(file);
    });
  } else if (entry.isDirectory) {
    let dirReader = entry.createReader();
    dirReader.readEntries((entries: any) => {
      for (let i = 0; i <= entries.length - 1; i++) {
        getFileFromEntryRecursively(entries[i]);
      }
    })
  }
}
</script>