绕过中间商,不用 input 标签也能搞定文件选择

news2024/12/29 14:12:22

💰 点进来就是赚到知识点!本文带你用 JS 实现文件选择功能点赞收藏评论更能促进消化吸收!

🚀 想解锁更多 Web 文件系统技能吗?快来订阅专栏「Web 玩转文件操作」!

📣 我是 Jax,在畅游 Web 技术海洋的又一年,我仍然是坚定不移的 JavaScript 迷弟,Web 技术带给我太多乐趣。如果你也和我一样,欢迎关注私聊

在本专栏的第一篇文章中,我们重新认识了 <input type=”file”> 这位老伙计,挖掘了它的几个彩蛋特性。在做文件上传时,input 标签确实是我们的黄金搭档。但是为了方便调教 CSS 样式,我们往往需要把 input 标签藏起来,而用其他 HTML 元素来做 UI 代理。似乎是我们只馋 <input type=”file”> 的身子,并不会给它一个名分 🐶。

但其实,不一定非要经过 input 标签这个中间商,我们是可以直接用 JavaScript 和系统进行文件交易的!

戳这里去看一个 demo!

在上面的示例中,左侧是传统 input 组合拳,右侧是纯 JavaScript 实现,而 JavaScript 实现的奥义,就是 showOpenFilePicker 这个方法。

使用方法

基础用法

showOpenFilePicker 是全局对象 window 的一个子方法,所以我们可以直接调用:

const [handle] = await showOpenFilePicker();

执行这个方法会得到一个 Promise,并从中 resolve 出一个数组,数组元素是一个个 FileSystemFileHandle 类型的对象。你可能对这个类型很陌生,但没关系,我们暂且把它当成是文件对象的容器即可。但关于 FileSystem 的相关知识,我们会在下一篇文章中涉及到,请持续关注!

FileSystemFileHandle 对象具有一个 getFile 方法,返回包含文件对象的 Promise

const [file] = await handle.getFile();

我们透视一下 file 对象的结构,你会发现和用 input 标签拿到的文件对象是完全一样的。

在这里插入图片描述

这样,无需引入和处理文件 input,我们也能实现选取文件的功能。

可选参数

我们知道,在文件 input 上可以配置 multipleaccept 等特性来满足特定的文件要求。相对应地,通过给方法传入配置参数,我们可以在 showOpenFilePicker 方法上复刻出同样的表现,甚至可以实现更强大的功能。

showOpenFilePicker({
    id: '',
    multiple: true,
    startIn: 'desktop',
    types: [{ ... }],
    excludeAcceptAllOption: true
})
  • id:指定一个字符串标识,相同的 id 会指向同一个文件路径。例如我们在首次调用时传入 id: ‘a’,用户在弹出窗口中选择了 dirA/subDirB/c.js 这个文件。在后续逻辑中,我们再次调用了 showOpenFilePicker({ id: ‘a’ }),打开的窗口会自动定位到 dirA/subDirB/ 这个路径。
  • multiple:这个无需多言,与 input 标签上的 multiple 特性一致。
  • startIn:该属性接收固定的枚举值(desktop、documents、downloads、music、pictures、videos),以 desktop 为例,可以直接打开桌面文件夹,方便快捷。但只支持通用操作系统的通用文件夹。
  • excludeAcceptAllOption:这个属性名非常值得吐槽,又长又七拐八弯的,我们可以直接理解为「限制文件格式」,为 true 时需要指定 types,意为只能选中给定文件格式;为 false 则代表格式不限。
  • types:一个对象数组,用于指定我们期望的文件格式。比如我们只想接收 .jpg 格式的图片,就可以这样配置:
showOpenFilePicker({
    types: [{
    description: '图片',
    accept: {
      'image/*': ['.jpg']
    }
  }]
})

使用限制

当然,我们在调用 showOpenFilePicker 时还需要注意一些限制条件:

  • 仅支持 https 协议的网页。
  • 必须由用户动作触发。这个条件与音视频自动播放类似,都需要有用户操作在先,不可以自动触发。

这些限制都是出于安全考虑或者防止滥用,可以给用户体验带来很大的保障。

写在结尾

恭喜你读完了本文,你真棒!

这次我们一起探究了 showOpenFilePicker 方法,学会了如何不依赖文件 input 实现文件选取功能。请继续关注我的专栏,下一篇我们将会继续深入 File API!

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

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

相关文章

【机器学习】线性回归算法简介 及 数学实现方法

线性回归 简介 利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 数学公式&#xff1a; ℎ_(w) w_1x_1 w_2x_2 w_3x_3 … b w^Txb 概念 ​ 利用回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关…

易基因: cfMeDIP-seq揭示cfDNA甲基化高效区分原发性和转移性前列腺|Nat Commun

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 前列腺癌&#xff08;Prostate cancer&#xff0c;PCa&#xff09;是男性中第二常见的恶性肿瘤&#xff0c;也是全球癌症相关死亡的第三大原因。虽然大多数原发性前列腺癌可以治愈&#…

交易所开发:构建安全、高效、可靠的数字资产交易平台

数字资产交易平台是加密市场中连接用户与数字货币的重要枢纽。开发一个安全、高效、可靠的交易所&#xff0c;不仅需要综合考虑技术架构、安全策略、用户体验等方面&#xff0c;还需严格遵循法规要求以确保合规性。本文总结了交易所开发的关键要素&#xff0c;包括其类型、核心…

振弦式土体沉降计有哪些功能特点

振弦式土体沉降计是一种广泛应用于土木工程领域的测量仪器&#xff0c;用于监测土石坝、边坡、地基等构筑物的沉降变形。以下是南京峟思给大家介绍的振弦式土体沉降计的主要优点&#xff1a; 高精度测量&#xff1a; 振弦式土体沉降计采用先-进的感应技术&#xff0c;能够精确地…

一个月学会Java 第5天 控制结构

Day5 控制结构 这么叫可能有些就算有基础的人也看不懂&#xff0c;其实就是if-else、switch-case、for、while、do-while这几个&#xff0c;没基础的听到了这个也不要慌张&#xff0c;这几个是程序的基础&#xff0c;多多训练就好 第一章 顺序结构 这章其实没有什么好讲的&…

Python 工具库每日推荐【openpyxl 】

文章目录 引言Python Excel 处理库的重要性今日推荐:openpyxl 工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:自动生成月度销售报告案例分析高级特性条件格式数据验证扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计…

2024 Mysql基础与进阶操作系列之MySQL触发器详解(20)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️ MYSQL REDIS Advance operation 专栏跑道二➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️HCIP&#xff1b;H3C-SE;CCIP——…

不容错过的10款文件加密软件,2024顶尖办公文件加密软件分享

随着数据隐私和信息安全越来越受到重视&#xff0c;文件加密已经成为保护个人和企业机密信息的必备工具。无论是敏感的个人文件、财务报表、商业机密&#xff0c;还是政府机密信息&#xff0c;都需要高效的加密工具来确保信息安全不被未经授权的人访问。在2024年&#xff0c;我…

盘点2024年4款打工人都在用的PDF软件。

PDF 软件在现代的办公或者是学习当中的应用非常广泛&#xff0c;已经成了很多人的必备工具。因为PDF 文件具有跨设备、跨系统的优势&#xff0c;所以在很多设备上都可以打开浏览。如果有了PDF 编辑软件&#xff0c;查看&#xff0c;编辑&#xff0c;分享也会变得更加方便简单&a…

web自动化测试基础(从配置环境到自动化实现登录测试用例的执行,vscode如何导入自己的python包)

接下来的一段时间里我会和大家分享自动化测试相关的一些知识希望大家可以多多支持&#xff0c;一起进步。 一、环境的配置 前提安装好了python解释器并配好了环境&#xff0c;并安装好了VScode 下载的浏览器和浏览器驱动需要一样的版本号(只看大版本)。 1、安装浏览器 Chro…

回到原点再出发

原文What Goes Around Comes Around作者Michael Stonebraker & Joseph M. Hellerstein其他译文https://zhuanlan.zhihu.com/p/111322429 1. 摘要 本文总结了近35年来的数据模型方案&#xff0c;分成9个不同的时代&#xff0c;讨论了每个时代的方案。我们指出&#xff0c;…

Vue3入门 - provide和inject组合使用

在Vue3中&#xff0c;provide和inject是用于实现依赖注入的一对API。它们允许在组件树中传递和接收数据&#xff0c;而不需要通过每一层显式地传递props。在<script setup>语法中&#xff0c;provide可以用来提供一个值&#xff0c;而inject可以用来接收一个已经提供的值…

RNN(循环神经网络)简介及应用

一、引言 在深度学习领域&#xff0c;神经网络被广泛应用于各种任务&#xff0c;从图像识别到语音合成。但对于序列数据处理的任务&#xff0c;如自然语言处理&#xff08;NLP&#xff09;、语音识别或时间序列预测等&#xff0c;传统的前馈神经网络&#xff08;Feedforward N…

启明智显工业级HMI芯片Model4功耗特性分享

Model4工业级MPU是国产自主面向工业应用的RISC-V架构的应用级芯片&#xff0c;内置玄铁64bit RISC-V CPU C906&#xff0c;主频高达600MHz&#xff0c;算力约1380DMIPS。支持RTOS、linux系统&#xff0c;支持LVGL工具开发UI&#xff1b; Model4系列工业级MPU具有极强的屏显、多…

每日OJ题_牛客_分组_枚举+二分_C++_Java

目录 牛客_分组_枚举二分 题目解析 C代码 Java代码 牛客_分组_枚举二分 分组 (nowcoder.com) 描述&#xff1a; dd当上了宣传委员&#xff0c;开始组织迎新晚会&#xff0c;已知班里有nnn个同学&#xff0c;每个同学有且仅有一个擅长的声部&#xff0c;把同学们分…

计算机组成原理:物理层 —— 编码与调制

文章目录 基本概念编码&#xff08;基带调制&#xff09;调制编码与调制码元 编码方式双极性不归零编码双极性归零编码曼彻斯特编码差分曼彻斯特编码优缺点 调制方法基本的带通调制方法调频 FM调幅 AM调相 PM 混合调制方法正交振幅调制 QAM-16 基本概念 编码&#xff08;基带调…

全国外卖霸王餐系统对接详细步骤操作?

对接全国外卖霸王餐系统并选择适合的系统时&#xff0c;你可以考虑以下几个步骤和标准&#xff1a; 明确业务需求&#xff1a;首先确定你的平台需要哪些功能&#xff0c;如展示霸王餐选项、下单、支付、订单跟踪等 。选择信誉良好的服务提供商&#xff1a;选择提供稳定服务的A…

【物流配送中心选址问题】基于改进粒子群算法

课题名称&#xff1a; 基于改进粒子群算法的物流配送中心选址问题 改进方向&#xff1a;动态惯性权重优化粒子群算法 代码获取方式&#xff1a; 模型描述&#xff1a; 待补充 Matlab仿真结果&#xff1a; 1. 模型优化后的仿真结果 2. 初始解对应的物流配送路径图 3. 粒子…

大厂最牛的 Java 面试八股文合集(全彩版),不接受反驳

金九银十已然来临&#xff0c;找工作的小伙伴比比皆是&#xff0c;很对小伙伴早早的就开始储备技术&#xff0c;准备面试了。 为了帮助小伙伴更好的应对面试&#xff0c;我拉来十几个大佬&#xff0c;汇总一线大厂的情况&#xff0c;给你整了一套超全的面试资料&#xff1a; 16…

以后再也不要说程序员不能拿诺贝尔了

当地时间10月8日&#xff0c;瑞典皇家科学院宣布&#xff0c;将2024年诺贝尔物理学奖授予美国普林斯顿大学的约翰霍普菲尔德&#xff08;John J. Hopfield&#xff09;和加拿大多伦多大学的杰弗里辛顿&#xff08;Geoffrey E. Hinton&#xff09;&#xff0c;以表彰他们“为推动…