拖拽文件上传

实现拖拽上传(文件夹和文件都可以拖拽)

原生js方法
<script>
    let items = []
    function unload(){
      const uploadDom = document.querySelector(".uploadDom")//获取dom
      uploadDom.ondragenter = function(e){
        e.preventDefault();//阻止默认拖拽事件
      }
      uploadDom.ondragover = function(e){
        e.preventDefault();
      }
      uploadDom.ondrop =  (e)=>{
        if(items.length!=0){
          items = []
        }
        e.preventDefault();
        let arr = []
        //有可能会出现e.dataTransfer.items为空的情况用arr.forEach.call解决,没有这个问题可以不用
         arr.forEach.call(e.dataTransfer.items,async function(file){ 
        
        //获取到一个 FileSystemFileEntry 对象或 FileSystemDirectoryEntry 对象。这两种都继承自 FileSystemEntry
          const entry = file.webkitGetAsEntry()

          await getReader(entry)
          setTimeout(()=>{
            let formDate = new FormData()
            items
            //文件已经获取,上传文件代码
          },1000)
        })
      }
    }
    function getReader(entry){
      //判断获取到的是否为文件
      if(entry.isDirectory){
        //创建一个目录读取器
        const reader = entry.createReader()
        //读取文件下的所有东西 异步的
        reader.readEntries( (entries)=>{
          for(let i = 0;i < entries.length;i++){
            //递归遍历所有文件
            getReader(entries[i])
          }
        })
      }else{
        //读取file文件,异步的
        entry.file((f)=>{
          items.push(f)
        })
      }
    }
    unload()
  </script>
vue中实现方法

html代码使用拖拽事件

<div 
    style="height:200px; width:300px;border:1px  solid #000"
    @dragover="dragover"
    @drop="drop"
    @dragenter="dragenter">
</div>
data(){
    return{
        items:[]
    }
},
methods:{
    dragenter(e){
      e.preventDefault()
    },
    dragover(event){
       event.preventDefault()
    },
    drop(event){
      let that = this
      this.items = []
      event.preventDefault()
      let arr =[]
      arr.forEach.call(event.dataTransfer.items,function(file){
        const entry = file.webkitGetAsEntry()
        that.getReader(entry)
      })
        //上传后续代码
    },
    getReader(entry){
      //判断获取到的是否为文件
      if(entry.isDirectory){
        //创建一个目录读取器
        const reader = entry.createReader()
        //读取文件下的所有东西 异步的
        reader.readEntries( (entries)=>{
          for(let i = 0;i < entries.length;i++){
            //递归遍历所有文件
            this.getReader(entries[i])
          }
        })
      }else{
        //读取file文件,异步的
        entry.file((f)=>{
          this.items.push(f)
          return
        })
      }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值