前端手写文件上传;使用input实现文件拖动上传

news2024/11/19 9:36:59

使用input实现文件拖动上传

在这里插入图片描述

vue2代码:

<template>
  <div>
    <div class="drop-area" @dragenter="highlight" @dragover="highlight" @dragleave="unhighlight" @drop="handleDrop"
      @click="handleClick">
      将文件拖拽到此处或者点击上传
      <input type="file" ref="fileInput"  accept=".png,.jpg,.jpeg,.pdf" @change="handleFiles" multiple style="display: none;">
    </div>
    <ul v-if="fileList.length">
      <li v-for="(file, index) in fileList" :key="index">{{ file.name }}</li>
    </ul>
    <pre>{{ fileList }}</pre>
  </div>
</template>

<script>
export default {
  data() {
    return {
      fileList: []
    };
  },
  methods: {
    highlight(e) {
      e.preventDefault();
      e.stopPropagation();
      e.target.classList.add('hover');
    },
    unhighlight(e) {
      e.target.classList.remove('hover');
    },
    handleDrop(e) {
      e.preventDefault();
      e.stopPropagation();
      this.unhighlight(e);
      const files = e.dataTransfer.files;
      console.log('拖拽得到List', e);
      // this.handleFiles(files);
      for (let i = 0; i < files.length; i++) {
        this.fileList.push({
          ...files[i],
          name: files[i].name,
          size: files[i].size,
          type: files[i].type
        });
      }
      this.uploadFile()
    },
    handleClick() {
      this.$refs.fileInput.click();
    },
    handleFiles(e) {
      console.log(11, e);
      const files = e.target.files || e;
      for (let i = 0; i < files.length; i++) {
        this.fileList.push({
          ...files[i],
          name: files[i].name,
          size: files[i].size,
          type: files[i].type
        });
      }
      this.uploadFile()
    },
    // 上传文件
    uploadFile() {
      console.log('this.fileList', this.fileList);
    }
  }
};
</script>

<style>
.drop-area {
  width: 300px;
  height: 200px;
  border: 2px dashed #ccc;
  border-radius: 10px;
  text-align: center;
  line-height: 200px;
  cursor: pointer;
}

.drop-area.hover {
  border-color: #11716f;
}

.drop-area:hover {
  border-color: #11716f;
}
</style>

vue3代码:

<template>
  <div>
    <div class="drop-area" @dragenter="highlight" @dragover="highlight" @dragleave="unhighlight" @drop="handleDrop"
      @click="handleClick">
      将文件拖拽到此处或者点击上传
      <input type="file" ref="fileInput" accept=".png,.jpg,.jpeg,.pdf" @change="handleFiles" multiple style="display: none;">
    </div>
    <ul v-if="fileList.length">
      <li v-for="(file, index) in fileList" :key="index">{{ file.name }}</li>
    </ul>
    <pre>{{ fileList }}</pre>
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const fileList = ref([]);
    const fileInput = ref(null);

    const highlight = (e) => {
      e.preventDefault();
      e.stopPropagation();
      e.target.classList.add('hover');
    };

    const unhighlight = (e) => {
      e.target.classList.remove('hover');
    };

    const handleDrop = (e) => {
      e.preventDefault();
      e.stopPropagation();
      unhighlight(e);
      const files = e.dataTransfer.files;
      for (let i = 0; i < files.length; i++) {
        fileList.value.push({
          ...files[i],
          name: files[i].name,
          size: files[i].size,
          type: files[i].type
        });
      }
      uploadFile();
    };

    const handleClick = () => {
      console.log(fileInput.value);
      fileInput.value.click(); // 使用 ref 的 value 直接访问 DOM 元素
    };

    const handleFiles = (e) => {
      const files = e.target.files || e;
      for (let i = 0; i < files.length; i++) {
        fileList.value.push({
          ...files[i],
          name: files[i].name,
          size: files[i].size,
          type: files[i].type
        });
      }
      uploadFile();
    };

    // 上传文件
    const uploadFile = () => {
      console.log('fileList', fileList.value);
    };

    return {
      fileList,
      highlight,
      unhighlight,
      handleDrop,
      handleClick,
      handleFiles,
      fileInput
    };
  }
};
</script>

<style>
.drop-area {
  width: 440px;
  height: 185px;
  border: 1px dashed #dcdfe6;
  border-radius: 6px;
  text-align: center;
  line-height: 185px;
  cursor: pointer;
}

.drop-area.hover {
  border-color: #11716f;
}

.drop-area:hover {
  border-color: #11716f;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1699522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决SpringBoot中插入汉字变成?(一秒解决)

在这里url后面加一行配置即可&useUnicodetrue&characterEncodingUTF-8即可 解释 spring.datasource.url: 这里包含了数据库的URL&#xff0c;以及额外的参数如useUnicodetrue用于启用Unicode字符集支持&#xff0c;characterEncodingUTF-8用于指定字符编码为UTF-8&…

【MinIO学习】

OSS Docker podman MinIO服务器 MinIO客户端 Bucket Object 时间同步 The difference between the request time and the servers time is too large。 URL

Linux防火墙之iptables(二)

一.SNAT策略概述 1.SNAT 策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet&#xff08;私有IP不能在Internet中正常路由&#xff09; 局域共享上网 2.SNAT 策略的原理 源地址转换&#xff0c;Source Network Address Translation 修改数据包的源地址 未作SNAT转换…

搭建Harbor镜像仓库

前言 1、系统版本&#xff1a;CentOS9 2、harbor版本&#xff1a;v2.9.4 3、提前安装好docker和docker-compose&#xff0c;参考地址。我这里安装的版本是docker&#xff1a;26.1.3 docker-compose&#xff1a;v2.27.1 安装步骤 下载安装包 1、下载地址&#xff1a;ha…

基于yolov5和desnet的猫咪识别模型

前言 前段时间给学校的猫咪小程序搭建了识猫模型&#xff0c;可以通过猫咪的照片辨别出是那只猫猫&#xff0c;这里分享下具体的方案&#xff0c;先看效果图&#xff1a; 源代码在文末 模型训练 在训练服务器&#xff08;或你的个人PC&#xff09;上拉取本仓库代码。 图片数据…

moviepy入门

1. 简介 由于恶心的工作和没有规划的部门安排&#xff0c;我被排到了算法部门&#xff0c;从事和算法没有半毛钱关系的业务上&#xff0c;也就是。。。搞视频。咋说呢&#xff1f;视频这东西我没有一点基础&#xff0c;还好有前人写好的代码&#xff0c;用的是moviepy和ffmpeg…

网络攻防概述(基础概念)

文章目录 APTAPT概念APT攻击过程 网络空间与网络空间安全网络空间(Cyberspace)网络空间安全(Cyberspace Security) 网络安全属性机密性(Confidentiality或Security)完整性(Integrity)可用性&#xff08;Availability&#xff09;不可否认性&#xff08;Non-repudiation&#xf…

通过unsplash引入图片素材

如果您还没听说过——当您需要无版权费的照片用于项目时&#xff0c;无论是否用于商业目的&#xff0c;Unsplash 都是您的不二之选。我自己也经常用它来获取大型背景图像。 虽然他们为开发者提供了出色的 API&#xff0c;但他们还为您提供了通过 URL 直接访问随机图片的选项。…

开源博客项目Blog .NET Core源码学习(27:App.Hosting项目结构分析-15)

本文学习并分析App.Hosting项目中后台管理页面的角色管理页面。   角色管理页面用于显示、检索、新建、编辑、删除角色数据同时支持按角色分配菜单权限&#xff0c;以便按角色控制后台管理页面的菜单访问权限。角色管理页面附带一新建及编辑页面&#xff0c;以支撑新建和编辑…

本地连接github仓库

【1】新建github仓库 【2】本地克隆并提交 $ git clone https://github.com/TomJourney/soil.git Cloning into soil... warning: You appear to have cloned an empty repository.pacosonDESKTOP-E4IASRJ MINGW64 /d/github/TomJourney/soil (master) $ git add readme.txtpa…

Android HAL到Framework

一、为什么需要Framwork? Framework实际上是⼀个应⽤程序的框架&#xff0c;提供了很多服务&#xff1a; 1、丰富⽽⼜可扩展的视图&#xff08;Views&#xff09;&#xff0c; 可以⽤来构建应⽤程序&#xff0c;它包括列表&#xff08;lists&#xff09;&#xff0c;⽹格&am…

指针(6)

1. sizeof和strlen的对比 1.1 sizeof 在学习操作符的时候&#xff0c;我们学习了 sizeof &#xff0c; sizeof 计算变量所占内存内存空间大小的&#xff0c;单位是字节&#xff0c;如果操作数是类型的话&#xff0c;计算的是使⽤类型创建的变量所占内存空间的大小。 sizeof 只…

精品丨快速申请免费https证书

https域名证书对提高网站排名有一定的好处&#xff0c;所以当今很多企业为了给网站一个好的安全防护&#xff0c;就会去申请该证书。如今很多企业虽然重视网站的安全防护&#xff0c;但是也重视成本&#xff0c;所以为了节约成本会考虑申请免费的https证书。 第一个好处 企业不…

力扣496. 下一个更大元素 I

Problem: 496. 下一个更大元素 I 文章目录 题目描述思路复杂度Code 题目描述 思路 因为题目说nums1是nums2的子集&#xff0c;那么我们先把nums2中每个元素的下一个更大元素算出来存到一个映射里&#xff0c;然后再让nums1中的元素去查表即可 复杂度 时间复杂度: O ( n 1 n 2…

吉林大学计科21级《软件工程》期末考试真题

文章目录 21级期末考试题一、单选题&#xff08;2分一个&#xff0c;十个题&#xff0c;一共20分&#xff09;二、问答题&#xff08;5分一个&#xff0c;六个题&#xff0c;一共30分&#xff09;三、分析题&#xff08;一个10分&#xff0c;一共2个&#xff0c;共20分&#xf…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-22讲 RTC 时钟设置

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

十四天学会Vue——Vue核心(理论+实战)(第一天)上篇

&#xff01;&#xff01;&#xff01;声明必看&#xff1a;由于本篇开始就写了Vue&#xff0c;内容过多&#xff0c;本篇部分内容还有待完善&#xff0c;小编先去将连续更新的js高阶第四天完成~本篇部分待完善内容明日更新 一、Vue核心&#xff08;上篇&#xff09; 热身top…

mysql - 索引原理

mysql索引原理 文中的查询, 以该表结构为例 CREATE TABLE user (id int NOT NULL COMMENT id,name varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT 姓名,age int NOT NULL COMMENT 年龄,sex tinyint(1) NOT NULL COMMENT 性别,phone varchar(255) CHARACTER SET utf8mb4…

06中间件RTOS/CP

Autosar CP 操作系统详解-CSDN博客 1. 什么是RTOS &#xff1f; RTOS&#xff0c;英文全称是 Real-time Operation System&#xff0c;中文就是 实时操作系统&#xff0c;又称及时操作系统。 实时操作系统&#xff0c;是指当外界事件或数据产生时&#xff0c;能够接受并以足…

GEC210编译环境搭建

一、下载编译工具链 下载&#xff1a;点击跳转 二、解压到 /usr/local/arm 目录 sudo mv gec210.zip /usr/local/arm cd /usr/local/arm sudo unzip gec210.zip 三、添加到环境变量 PATH/usr/local/arm/arm-cortex_a8-linux-gnueabi-4.7.3/bin:$PATH 四、测试验证 在终端…