【Effective Web】文件上传

文章目录

  • 前言
  • 一、选择本地文件
    • 1.设计一个上传文件按钮
    • 2.FileReader读取文件内容
  • 二、使用拖拽方式
    • 1.设计一个拖拽容器
    • 2.拖拽文件的相关事件回调
  • 三、使用粘贴方式
    • 1.设计一个粘贴容器
    • 2.paste事件回调
  • 四、总结


前言

前端无法像app一样直接操作本地文件,对本地文件的操作和上传,通常使用以下三种方式:

  1. 通过input type = file 选择本地文件上传,这是最常见的方式
  2. 通过拖拽的方式把文件拖过来
  3. 在编辑框里面复制黏贴,这种方式常见于上传图片。

一、选择本地文件

1.设计一个上传文件按钮

通过input type = file 选择本地文件上传,通常会自定义一个按钮,然后盖在上面,因为type=file的input不容易改变样式。
这里使用label做样式覆盖,label 元素不会向用户呈现任何特殊效果。不过,它为鼠标用户改进了可用性。如果在 label 元素内点击文本,就会触发此控件。就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上。

注意:label中的for属性应与input元素的id一致

    <form id="form">
      <label for="submit">
        <div class="lBut">
          <span>选择文件</span>
        </div>
      </label>
      <input id="submit" type="file" />
    </form>
  #submit {
    display: none;
  }
  .lBut {
    width: 87px;
    height: 24px;
    font-size: 14px;
    line-height: 24px;
    display: flex;
    justify-content: center;
    align-items: center;
    border-radius: 4px;
    margin-left: 28px;
    transition: all 0.5s;
    white-space: nowrap;
    background-color: #409eff;
    color: white;
    border: 1px solid #409eff;
  }

而通过表单选择的文件无法直接获取文件真实存放路径,文件里面内容也无法查看。formData格式的文件可以作为接口参数传给后台。

  const inputFile = document.getElementById("submit");
  const form = document.getElementById("form");

  inputFile.addEventListener("change", function () {
    let formData = new FormData(form);
    console.log("formData :>> ", formData);
    console.log("inputFile.value :>> ", inputFile.value);
  });

在这里插入图片描述

2.FileReader读取文件内容

当选择文件后,触发input的change事件,在change的回调方法中初始化一个fileReader对象,fileReader有一个方法readAsDataURL可以读取文件并转为base64格式。在fileReader读取文件后触发onload回调方法,在回调方法中获取文件的结果,并创建一个img元素把结果作为src属性值,展示在页面上。
js代码如下:

const inputFile = document.getElementById("submit");
  const form = document.getElementById("form");

  inputFile.addEventListener("change", function () {
    let file = inputFile.files[0];
    if (!file) return;
    console.log("file :>> ", file);

    // 读取文件并转化为base64格式
    let fileReader = new FileReader();
    fileReader.readAsDataURL(file);

    fileReader.onload = function () {
      console.log("fileReader :>> ", fileReader);
      if (/^image\/[jpeg|png|gif]/.test(file.type)) {
        let img = document.createElement("img");
        img.src = fileReader.result;
        img.style.width = "500px";
        document.body.append(img);
      }
    };
  });

在这里插入图片描述

二、使用拖拽方式

1.设计一个拖拽容器

  <body>
    <div id="container">drag your image here</div>
  </body>

<style>
  #container {
    width: 500px;
    height: 500px;
    border: 1px solid #dfdfdf;
    margin: 0 auto;
    text-align: center;
    vertical-align: middle;
  }
</style>

在这里插入图片描述

2.拖拽文件的相关事件回调

容器的dragover事件和drop事件的默认行为是打开新页面展示,需要阻止默认行为
在drop事件回调中,获取拖拽的文件,数据存储在event.dataTransfer.files中,然后就可以调用fileReader.readAsDataURL或添加到formData中了

  const container = document.getElementById("container");
  container.addEventListener("dragover", function (event) {
    // 浏览器默认行为是打开新页面展示,需要阻止默认行为
    event.preventDefault();
  });

  container.addEventListener("drop", function (event) {
    console.log("event :>> ", event);
    event.preventDefault(); // 阻止默认的点击事件执行

    let file = event.dataTransfer.files[0];
    console.log("file :>> ", file);
    if (!file) return;

    showImg(file);
  });

  const showImg = (file) => {
    // 读取文件并转化为base64格式
    let fileReader = new FileReader();
    fileReader.readAsDataURL(file);

    fileReader.onload = function () {
      if (/^image\/[jpeg|png|gif]/.test(file.type)) {
        let img = document.createElement("img");
        img.src = fileReader.result;
        img.style.width = "500px";
        container.append(img);
      }
    };
  };

三、使用粘贴方式

1.设计一个粘贴容器

粘贴通常在一个编辑框操作,比如把div的contenteditable设置为true

<div id="container" contenteditable="true">paste your image here</div>

2.paste事件回调

粘贴的数据在event.clipboardData.files中,在容器的paste获取,代码如下:

  const container = document.getElementById("container");

  container.addEventListener("paste", function () {
    event.preventDefault();
    let file = event.clipboardData.files[0];
    console.log("file :>> ", file);
    if (!file) return;

    showImg(file);
  });

  const showImg = (file) => {
    // 读取文件并转化为base64格式
    let fileReader = new FileReader();
    fileReader.readAsDataURL(file);

    fileReader.onload = function () {
      if (/^image\/[jpeg|png|gif]/.test(file.type)) {
        let img = document.createElement("img");
        img.src = fileReader.result;
        img.style.width = "500px";
        container.append(img);
      }
    };
  };

四、总结

文件的上传常见有三种方式:选择文件、拖拽和粘贴。选择文件通常使用表单,文件的数据在form.files中,form为表单元素;拖拽的方式,文件的数据在drop事件的event.dataTransfer.files中;粘贴的方式,文件的数据在paste事件的event.clipboardData.files中;在获取上传文件的数据后,使用fileReader来读取文件数据,展示在页面上,或者添加到formData上,通过接口传递给后台。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python基础教程】4 . 算法的空间复杂度

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;python基础教程 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、…

ansible-2

逻辑卷相关模块&#xff1a;逻辑卷可以动态管理存储空间&#xff0c;可以对逻辑卷进行扩容或缩减。可以把硬盘或分区转换成物理卷PV&#xff0c;在把1到多个PV组合成卷组VG&#xff0c;然后在VG上划分逻辑卷LV&#xff0c;LV可以像普通分区一样&#xff0c;进行格式化、挂载。 …

【零基础C语言】文件操作

目录 理解文件操作 什么是文件 程序文件 数据文件 文件名字 二进制文件和文本文件 文件的打开和关闭 文件的打开和关闭操作 实验1&#xff0c;打开一个文件并且输入26个字母 打开读取文件text.txt ,并且将它拷贝进text_cpy.txt 使用 fputs 和 fgets 函数 使用 fprintf函…

【并发】第二篇 ThreadLocal详解

导航 一. ThreadLocal 简介二. ThreadLocal 源码解析1. get2. set3 .remove4. initialValue三. ThreadLocalMap 源码分析1. 构造方法2. getEntry()3. set()4. resize()5. expungeStaleEntries()6. cleanSomeSlots()7. nextIndex()8. remove()9. 总结ThreadLocalMap四. 内存泄漏…

校园局域网钓鱼实例

Hello &#xff01; 我是"我是小恒不会java" 本文仅作为针对普通同学眼中的网络安全&#xff0c;设计的钓鱼案例也是怎么简陋怎么来 注&#xff1a;本文不会外传代码&#xff0c;后端已停止使用&#xff0c;仅作为学习使用 基本原理 内网主机扫描DNS劫持前端模拟后端…

算法题剪格子使我重视起了编程命名习惯

剪格子是一道dfs入门题。 我先写了个dfs寻找路径的模板&#xff0c;没有按题上要求输出。当我确定我的思路没错时&#xff0c;一直运行不出正确结果。然后我挨个和以前写的代码对比&#xff0c;查了两个小时才发现&#xff0c;是命名风格的问题。 我今天写的代码如下&#xff…

03---java面试八股文——mybatis-------8题

21、MyBatis实现一对一查询 MyBatis 有两种不同的方式加载关联&#xff1a; 嵌套 Select 查询&#xff1a;通过执行另外一个 SQL 映射语句来加载期望的复杂类型。嵌套结果映射&#xff1a;使用嵌套的结果映射来处理连接结果的重复子集。查看mybatis的关联 MyBatis是一种流行的J…

基于springboot的船舶维保管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

Java研学-SpringBoot(四)

六 SpringBoot 项目搭建 1 创建项目 spring2.X版本在2023年11月24日停止维护&#xff0c;而Spring3.X版本不支持JDK8&#xff0c;JDK11&#xff0c;最低支持JDK17&#xff0c;目前阿里云还是支持创建Spring2.X版本的项目 2 修改所需依赖版本 – pom <?xml version&quo…

Platypus 一种集中式的央行数字货币方案

集中式的CBDC&#xff0c;混合使用账户模型和UTXO模型。 角色分类 中央银行&#xff1a;发行货币&#xff0c;交易验证&#xff0c;公开交易日志&#xff0c;防止双花。 不是完全受信任的&#xff0c;假定为会遵守监管要求&#xff0c;但可能会破坏交易隐私&#xff0c;即获…

C语言——字符串函数

一.前言 我们在日常写代码的过程中&#xff0c;经常会对字符串进行处理的过程。而在C语言中的<string.h>中&#xff0c;包含了众多字符串函数&#xff0c;我们可以借助这些字符串函数来对其进行各种操作。 二.strlen函数 strlen函数的作用是求出所传字符串的长度。该函…

spring-boot之shiro安全框架配置使用

shiro架构&#xff08;外部&#xff09; shiro架构(内部) 具体API操作 获取当前的用户对象 Subject currentUser SecurityUtils.getSubject();通过当前用户拿到session Session session currentUser.getSession(); session.setAttribute("someKey", "aValu…

Android 自定义坐标曲线图(二)

Android 自定义坐标曲线图_android 自定义曲线图-CSDN博客 继上一篇文章&#xff0c;点击折线图上的点&#xff0c;显示提示信息进行修改&#xff0c;之前通过回调&#xff0c;调用外部方法&#xff0c;使用popupwindow或dialog来显示&#xff0c;但是这种方法对于弹框显示的位…

SpringCloud实用篇(二)——搭建eureka服务

搭建eureka服务 搭建EurekaServer 注册eureka自己本身 1.创建项目&#xff0c;引入spring-cloud-starter-neflix-eureka-server的依赖 <!--eureka服务端--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cl…

Windows 远程访问 Ubuntu Desktop - 虚拟网络控制台 (Virtual Network Console,VNC)

Windows 远程访问 Ubuntu Desktop - 虚拟网络控制台 [Virtual Network Console&#xff0c;VNC] References 1. Desktop Sharing 2. Desktop Sharing Preferences 勾选 允许其他人查看您的桌面 勾选 要求远程用户输入此密码 取消勾选 必须为对本机器的每次访问进行确定 3. 虚拟…

Qt 富文本处理 (字体颜色大小加粗等)

Qt中支持HTML的控件有textEdit 、label 、textBrowser 。 接口&#xff1a;setHtml("Qt"); toHtml(). 文本样式设置 : 可分字设置 &#xff0c;主要使用QTextCharFormat类进行文本样式设置。 示例&#xff1a; QTextCharFormat fmt; //粗体 fmt.setFontWeight…

Linux中常用命令(文件、目录和文件压缩)及功能示例

一、Linux关于文件与目录的常用命令及其功能示例 命令: ls 全名: List (列表) 常用选项: -l: 详细列表格式&#xff0c;显示详细信息。-a: 显示所有文件&#xff0c;包括隐藏文件。 功能: 列出目录内容。 示例: ls -la /home 此命令以详细格式列出/home目录中的所有文件&#x…

openLooKeng开发环境搭建

文章目录 搭建OpenLooKeng开发环境要求 以下是搭建OpenLooKeng开发环境的基本步骤&#xff1a;1、从OpenLooKeng的GitHub仓库克隆代码&#xff1a;2、 构建OpenLooKeng生成IntelliJ IDEA项目文件 airbase构建项目过程中出现的问题checkstyle错误版本冲突问题hetu-heuristic-ind…

java将文件转成流文件返回给前端

环境&#xff1a;jdk1.8&#xff0c;springboot2.5.3,项目端口号&#xff1a;9100 1.待转换的文件 一、路径 二、文件内容 2.controller中代码 package com.example.pdf.controller;import com.example.pdf.service.GetFileStreamService; import org.springframework.web.b…

linux离线安装jdk

一、下载jdk 地址: Java Downloads | Oracle 中国 具体下载什么版本要根据安装的linux系统架构来决定&#xff0c;是ARM64还是X64&#xff0c;linux命令行输入如下命令 uname -m 可以看到linux系统是x64 架构(x86是32位&#xff0c;x86_64是64位&#xff0c;由于x86已经淘汰&…