Vueは、デスクトップからWebページへのファイルのドラッグを実現します(画像/オーディオ/ビデオを表示できます)

効果
ここに画像の説明を挿入>ここに画像の説明を挿入
ブログコードハスキーへようこそ

テクニカルチャット交換グループ974178910
フロントエンド交換グループ535620886

使用する場合は、コードとスタイルを自分で最適化してください

写真を表示しない/ビデオやオーディオを再生しないためのコードは次のとおりです

<template>
    <div>
        <div  v-on:dragover="tts" v-on:drop="ttrs" style="width: 800px;height: 200px;border: 1px solid black;font-size: 40px;line-height: 200px">
            {
   
   {dt}}
        </div>
        <div v-for="(item,index) in fileList" :key="index" style="width: 800px;height: 200px;border: 1px solid black;font-size: 40px;position: relative;top:10px">
            <p style="font-size: 20px;float: left;position: relative;left: 20pxword-wrap:break-word;word-break:normal;">{
   
   {item.name}}</p>
            <h5 style="float:right;position: absolute;top: 80px;right: 20px">{
   
   {item.type}}</h5>
            <h6 style="position: absolute;top: 80px;float: left;left: 20px">{
   
   {item.size | sizeType}}</h6>
            <button style="float: right" @click="del(index)">删除</button>
        </div>
    </div>
</template>

<script>
    export default {
     
     
        name: "trs",
        data(){
     
     
            return{
     
     
                dt:"",
                fileList:[]
            }
        },
        filters:{
     
     
          sizeType(val){
     
     
              let kbs = val/1024;
              let mbs = 0;
              let gbs = 0;
              if(kbs>=1024){
     
     
                  mbs = kbs/1024;
              }
              if(mbs>=1024){
     
     
                  gbs=mbs/1024
                  return gbs.toFixed(2)+"GB";
              }else if (mbs>=1){
     
     
                  return mbs.toFixed(2)+"MB"
              }else {
     
     
                  return kbs.toFixed(2)+"KB"
              }
          }
        },
        mounted() {
     
     
            let vm = this;
            window.addEventListener("dragdrop", this.testfunc, false);


           document.addEventListener("dragover",function () {
     
     
                console.log(111)
                vm.dt = "拖动到此处上传文件"
                console.log(vm.dt)
            })
        },
        methods:{
     
     
            testfunc(event) {
     
     
                alert("dragdrop!");
                event.stopPropagation();
                event.preventDefault();
            },
            del(index){
     
     
                this.fileList.splice(index,1)
                if(this.fileList.length==0){
     
     
                    this.dt = ""
                }
            },
            tts(e){
     
     
                console.log(e)
                this.dt = "拖动到此处上传文件"
            },
            ttrs(e){
     
     
                console.log(e)
                console.log(e.dataTransfer.files)
                let datas = e.dataTransfer.files;
                datas.forEach(item=>{
     
     
                    this.fileList.push(item)
                })
                e.stopPropagation();
                e.preventDefault();
                this.dt = "上传完成,可继续上传"

            }
        }
    }
</script>

<style scoped>

</style>


写真を表示したり、ビデオを再生したり、オーディオを再生したりする場合

ここでは、デフォルトで最後にアップロードされたファイルを表示/再生し、必要に応じて変更します

<template>
  <div>
    <div
      v-on:dragover="tts"
      v-on:drop="ttrs"
      style="width: 800px;height: 200px;border: 1px solid black;font-size: 40px;line-height: 200px"
    >
      {
   
   { dt }}
    </div>
    <div
      v-for="(item, index) in fileList"
      :key="index"
      style="width: 800px;height: 200px;border: 1px solid black;font-size: 40px;position: relative;top:10px"
    >
      <p
        style="font-size: 20px;float: left;position: relative;left: 20pxword-wrap:break-word;word-break:normal;"
      >
        {
   
   { item.name }}
      </p>
      <h5 style="float:right;position: absolute;top: 80px;right: 20px">
        {
   
   { item.type }}
      </h5>
      <h6 style="position: absolute;top: 80px;float: left;left: 20px">
        {
   
   { item.size | sizeType }}
      </h6>
      <button style="float: right" @click="del(index)">删除</button>
    </div>
    <div style="position:relative;top: 100px">
      <img v-if="isImage" :src="srcs" style="width: 800px" />
        <video v-if="isVideo" controls :src="srcs" style="width: 800px"></video>
        <audio v-if="isAudio" controls :src="srcs" style="width: 800px"></audio>
    </div>
  </div>
</template>

<script>
export default {
     
     
  name: "trs",
  data() {
     
     
    return {
     
     
      dt: "",
      fileList: [],
      srcs:"",
        isImage:false,
        isAudio:false,
        isVideo:false
    };
  },
  filters: {
     
     
    sizeType(val) {
     
     
      let kbs = val / 1024;
      let mbs = 0;
      let gbs = 0;
      if (kbs >= 1024) {
     
     
        mbs = kbs / 1024;
      }
      if (mbs >= 1024) {
     
     
        gbs = mbs / 1024;
        return gbs.toFixed(2) + "GB";
      } else if (mbs >= 1) {
     
     
        return mbs.toFixed(2) + "MB";
      } else {
     
     
        return kbs.toFixed(2) + "KB";
      }
    }
  },
  mounted() {
     
     
    let vm = this;
    window.addEventListener("dragdrop", this.testfunc, false);

    document.addEventListener("dragover", function() {
     
     
      console.log(111);
      vm.dt = "拖动到此处上传文件";
      console.log(vm.dt);
    });
  },
  methods: {
     
     
      readFile(file){
     
     
          let vm = this;
          let reader = new FileReader();
          reader.readAsDataURL(file)
          reader.onload = function () {
     
     
              let type = file.type.substr(0,5);
              if(type=="image"){
     
     
                  vm.isImage = true;
                  vm.isAudio =false;
                  vm.isVideo = false;
              }else if(type=="audio"){
     
     
                  vm.isImage = false;
                  vm.isAudio =true;
                  vm.isVideo = false;
              }else if(type=="video"){
     
     
                  vm.isImage = false;
                  vm.isAudio = false;
                  vm.isVideo = true;
              }else {
     
     
                  alert("不是图片/视频/音频")
              }
              vm.srcs = reader.result;
              // this.$nextTick(()=>{
     
     
              //
              // })
          }
      },
    testfunc(event) {
     
     
      alert("dragdrop!");
      event.stopPropagation();
      event.preventDefault();
    },
    del(index) {
     
     
      this.fileList.splice(index, 1);
      if (this.fileList.length === 0) {
     
     
        this.dt = "";
      }
    },
    tts(e) {
     
     
      console.log(e);
      this.dt = "拖动到此处上传文件";
    },
    ttrs(e) {
     
     
      console.log(e);
      console.log(e.dataTransfer.files);
      let datas = e.dataTransfer.files;
      datas.forEach(item => {
     
     
        this.fileList.push(item);
      });
      this.readFile(this.fileList[this.fileList.length-1])

      e.stopPropagation();
      e.preventDefault();

      this.dt = "上传完成,可继续上传";
    }
  }
};
</script>

<style scoped></style>





ブログコードハスキーへようこそ

テクニカルチャット交換グループ974178910
フロントエンド交換グループ535620886

おすすめ

転載: blog.csdn.net/qq_42027681/article/details/114109519