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 表单输入框不支持focus及blur事件的解决方案
Nov 17 Vue.js
对vue生命周期的深入理解
Dec 03 Vue.js
vue使用exif获取图片旋转,压缩的示例代码
Dec 11 Vue.js
vue实现滚动鼠标滚轮切换页面
Dec 13 Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
详解Vue的异步更新实现原理
Dec 22 Vue.js
vue中封装axios并实现api接口的统一管理
Dec 25 Vue.js
vue实现轮播图帧率播放
Jan 26 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
vue-cropper插件实现图片截取上传组件封装
May 27 Vue.js
如何用vue实现网页截图你知道吗
Nov 17 Vue.js
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
Apr 06 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
极典R601SW收音机
2021/03/02 无线电
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
php中字符串和正则表达式详解
2014/10/23 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
2019/09/18 PHP
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
JavaScript 字符串乘法
2009/08/20 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
JS获取并操作iframe中元素的方法
2013/03/21 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
2017/08/18 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
Python中的匿名函数使用简介
2015/04/27 Python
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
Python 函数基础知识汇总
2018/03/09 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
html5实现移动端适配完美写法
2017/11/16 HTML / CSS
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
演讲稿格式
2014/04/30 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技