vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)


Posted in Vue.js onMarch 01, 2021

效果

vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)

vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)

若使用 请自行优化代码和样式

不显示图片/播放视频音频代码如下

<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>

到此这篇关于vue实现桌面向网页拖动文件(可显示图片/音频/视频)的文章就介绍到这了,更多相关vue拖动文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue中defineProperty和Proxy的区别详解
Nov 30 Vue.js
vue element实现表格合并行数据
Nov 30 Vue.js
Vue与React的区别和优势对比
Dec 18 Vue.js
Vue实现随机验证码功能
Dec 29 Vue.js
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
vue如何使用rem适配
Feb 06 Vue.js
详解Vue.js 可拖放文本框组件的使用
Mar 03 Vue.js
vue3.0封装轮播图组件的步骤
Mar 04 Vue.js
vue项目两种方式实现竖向表格的思路分析
Apr 28 Vue.js
vue实现简单数据双向绑定
Apr 28 Vue.js
Vue3.0写自定义指令的简单步骤记录
Jun 27 Vue.js
vue修饰符.capture和.self的区别
Apr 22 Vue.js
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 #Vue.js
vue实现拖拽进度条
Mar 01 #Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 #Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 #Vue.js
vue-router路由懒加载及实现的3种方式
Feb 28 #Vue.js
vue-router懒加载的3种方式汇总
Feb 28 #Vue.js
Vue SPA 首屏优化方案
Feb 26 #Vue.js
You might like
php预定义变量使用帮助(带实例)
2013/10/30 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
jquery实现居中弹出层代码
2010/08/25 Javascript
最短的IE判断代码
2011/03/13 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
Django框架验证码用法实例分析
2019/05/10 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
python 循环数据赋值实例
2019/12/02 Python
详解从Django Allauth中进行登录改造小结
2019/12/18 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
Python实现仿射密码的思路详解
2020/04/23 Python
详解python tkinter 图片插入问题
2020/09/03 Python
Python如何实现机器人聊天
2020/09/10 Python
通过实例解析python and和or使用方法
2020/11/14 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
简单html5代码获取地理位置
2014/03/31 HTML / CSS
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
请说出这段代码执行后a和b的值分别是多少
2015/03/28 面试题
2015年度合同管理工作总结
2015/05/22 职场文书
《称赞》教学反思
2016/02/17 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书