位置: IT常识 - 正文

web前端文件上传可选择的4种方式(前端 上传文件)

编辑:rootadmin
web前端文件上传可选择的4种方式

推荐整理分享web前端文件上传可选择的4种方式(前端 上传文件),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:前端实现文件上传,web前端图片上传,web前端文件上传不了,前端上传文件到后端,前端上传文件夹,前端上传文件到后端,前端 上传文件,前端实现文件上传,内容如对您有帮助,希望把文章链接给更多的朋友!

在web前端开发中,文件上传属于很常见的功能,不论是图片、还是文档等等资源,或多或少会有上传的需求。一般都是从添加文件开始,然后读取文件信息,再通过一定的方式将文件上传到服务器上,以供后续展示或下载使用。 本文将讲述文件上传中所能用到的4种添加读取文件的方式:

input上传控件拖拽文件粘贴文件File System Access APIinput上传控件

首先介绍的,就是最常用的html表单控件:input[type=file],它允许用户打开系统的文件选择框,选择相应文件后加载并读取到相关文件信息,它支持单个文件或多个文件,多文件选择增加属性:multiple。 input上传控件的浏览器支持度最高,作为html的基础标签功能,一直都是web开发中使用最多的一种文件上传方式。 它支持的主要属性:

multiple:允许用户选择多个文件进行添加accept:指定文件上传时能接受的文件类型(MIME),如 image/png、image/*、video/* 等等

html控件代码如下,接受批量添加图片文件:

<input id="fileInput" type="file" accept="image/*" multiple onchange="selectFile()" />

以上代码添加了 onchange 事件,当选中不同文件时,可以获取到文件信息:

const fileInput = document.getElementById('fileInput')function selectFile () { const file = fileInput.files[0]}

上面的js代码,就是监听事件的函数,通过元素对象,读取正在添加的文件信息。 或者也可以添加事件监听器,同样能读取到文件信息:

document.getElementById('fileInput').addEventListener('change', (e) => { const file = e.target.files[0]}, false)

这里读取的上传控件元素对象的文件属性 files,它是 FileList 对象,一个针对 File 对象的集合。

文件信息是使用 File 对象API,用于接收文件,具体的介绍可见博文 详解前端二进制:Blob、File、FileReader、ArrayBuffer、TypeArray、DataView

修改上传控件样式

input文件上传控件,之前被诟病比较多的就是样式太单一,在整体设计风格上会有很多局限,但我们可以使用css样式中的一个伪元素来美化该控件。 这个伪元素就是 ::file-selector-button,通过它可以对上传控件按钮进行颜色字体背景边框等进行各种样式设置。具体信息可见博文CSS伪元素详解以及伪元素与伪类的区别

input::file-selector-button { border: 1px solid #f00; font-size: 20px; border-radius: 5px; background-color: azure;}

以上代码,即通过伪元素对上传控件按钮进行了样式的修改,效果如下图。 当然,这个伪元素只能修改按钮的样式,至于上传控件的其他部分包括文字内容,无法修改,仍然会较影响设计,这时候我们就需要使用另外的方式,比如隐藏上传控件。

隐藏上传控件

我们只需要让上传控件隐藏不显示,但在点击的时候还能够触发上传控件的文件选择框,就能达到自定义各种好看样式的上传控件的目的。 隐藏上传控件的方式有很多种,下面介绍其中一种,通过透明度的方式,先设置一个外部div元素,div内添加input上传元素,并设置透明度为0,达到不显示的目的,代码如下:

<div class="input-container"> 点击 <span style="color: red;">选择文件</span> 进行上传 <input class="input-file" type="file" name="file" multiple="multiple" /></div>.input-container { position: relative; width: 250px; margin: 20px 0;}.input-file { position: absolute; top: 0; left: 0; margin: 0; opacity: 0;}

以上代码,input上传控件元素通过绝对定位的方式置于div上层,透明度为0隐藏,视觉上只会显示底层div的内容(我们可自定义样式),但input控件会优先响应点击事件,这样就可以达到添加文件的目的。 当然,类似隐藏的方法还有多种,基于css样式实现,可以设计出更多更好看的文件上传组件。

拖拽文件

第二种介绍的添加文件的方式是拖拽文件,就是通过拖放(drag and drop)过程中的事件监听读取文件。主要针对的是三个拖拽相关的事件:

dragenter:拖拽进入当前节点时触发dragover:拖拽位于节点上方时,持续触发drop:当拖拽至目标节点,释放时触发

我们只需要在页面上添加一个div元素标签,设置一定的区域大小,对这个元素的拖放事件进行监听即可:

const dropArea = document.getElementById('dropArea')const stopPropagation = (e) => { e.stopPropagation() e.preventDefault()}dropArea.addEventListener('dragenter', stopPropagation, false)dropArea.addEventListener('dragover', stopPropagation, false)dropArea.addEventListener('drop', (dragEvent) => { stopPropagation(dragEvent) const file = dragEvent.dataTransfer.files[0]}, false)web前端文件上传可选择的4种方式(前端 上传文件)

以上代码,监听了拖放事件,当我们从电脑上拖动一个文件到指定div区域内,释放以后,就能获取了drop事件对象 DragEvent,它拥有一个独有属性 dataTransfer,是一个 DataTransfer 对象,能读取到文件属性 ‘files’。 接下来,我们了解下 DataTransfer 对象。

Datatransfer

Datatransfer 对象用于获取拖放事件中传输的数据。所有的拖放事件都包含一个该类型的属性。 我们在事件监听中读取到该对象后,可以从它的属性里读取到需要的数据,如文件信息。 该对象除了从拖放事件中获取以外,还能从 ClipboardEvent.clipboardData 剪切板事件上获取(后文会介绍)。

Datatransfer 对象拥有的属性和方法:

dropEffect:获取当前选定的拖放操作类型或者设置的为一个新的类型。值必须为none, copy, link或move。effectAllowed:提供所有可用的操作类型。必须是none, copy, copyLink, copyMove, link, linkMove, move, all or uninitialized 之一。files:包含数据传输中可用的所有本地文件的列表。items:只读,提供一个包含所有拖动数据列表的DataTransferItemList对象。types:只读,一个提供dragstart事件中设置的格式的字符串数组。clearData():删除与给定类型关联的数据。不给定参数则删除所有getData():检索给定类型的数据。setData():设置给定类型的数据。不存在则添加到末尾,存在则替换相同位置的数据。setDragImage():用于设置自定义的拖动图像。粘贴文件

除了拖拽文件以外,还有依赖剪切板的粘贴文件的方式,通过复制文件,并在指定元素区域内粘贴文件,这个时候,我们监听元素的 onpaste 事件,就可以得到想要的文件了。

onpaste事件:在将剪切板内容粘贴到文档时触发的事件,事件对象 ClipboardEvent,拥有一个 clipboardData 只读属性,存放剪切板的数据,它是一个DataTransfer对象(见上文)。 有了这个事件和相应的属性,实现文件读取就比较方便了:

document.getElementById('textarea').onpaste = (clipboardEvent) => { clipboardEvent.stopPropagation() clipboardEvent.stopImmediatePropagation() const { items, files } = clipboardEvent.clipboardData if (files && files.length) { const file = files[0] }}

以上代码,通过监听一个 textarea 元素的 onpaste 事件,读取到 clipboardData 属性,包含了 files,就读取到了文件信息,使用上也较为方便。

粘贴的方式,除了文件以外,文本内容之类的数据也可以处理。

File System Access API

File System Access API 文件系统访问API,允许访问读写文件及管理功能。它拥有多个API对象和方法,能够从用户的本地设备上进行文件交互,核心功能包括读写文件、访问目录结构等等。它的浏览器支持正在慢慢变好,chrome、edge与opera都已支持,然而firefox还不支持。 下文将着重介绍文件读取的API对象和方法,让我们能了解这种新的文件读取的方式。

showOpenFilePicker

showOpenFilePicker 是用于打开文件选择框,选中并添加文件的一个异步方法,支持 async/await。 它的语法:showOpenFilePicker(options)。

options 可选属性对象:

multiple:布尔值,是否能选择多个文件。默认false,表示只能选择一个文件。excludeAcceptAllOption:布尔值,是否排除types对象中所有的accept文件类型。默认false,不排除。types:可选的文件类型数组,数组元素也是对象,支持以下参数:description:表示文件或者文件夹的描述。accept:接受的文件类型,对象,用法如 { 'image/*': ['.png', '.gif', '.jpeg', '.jpg'] }。

showOpenFilePicker 方法返回一个 FileSystemFileHandle 对象数组,用来处理文件信息。

FileSystemHandle 对象提供一个系统文件的句柄,用于读取文件对象。它提供了一个方法:getFile(),返回文件对象,支持 async/await。 下面看一个具体的示例:

<button id="openImageFile">打开图片</button>document.getElementById('openImageFile').addEventListener('click', async () => { const handle = await showOpenFilePicker({ multiple: true, types: [{ description: '图片', accept: { 'image/png': ['.jpg', '.png'] } }] }) if (handle && handle.length) { const handleFile = handle[0] const file = await handleFile.getFile() }}, false)

以上代码,通过按钮的click事件,使用showOpenFilePicker方法打开选择文件框,添加一个文件。

上传

读取到文件信息以后,就是将文件上传到服务器上,可以使用基本的上传方式,HTML表单:

<form action="url" enctype="multipart/form-data" method="post"> <input name="fileInput" type="file" /> <button type="submit">提交</button></form>

以上代码,就是通过form表单,以 post 的方式将文件上传到 action 属性对应的url上传链接。 这种方式一般针对的就是input文件上传控件。

除了HTML表单的方式以外,我们还是可以使用 FormData 对象,构造一个表单数据,通过ajax等方式进行异步数据上传:

const formData = new FormData()formData.append('file', file, file.name)const xhr = new XMLHttpRequest()xhr.open('POST', 'url', true)xhr.send(formData)

以上代码,就是通过构造一个 formData 实例,添加文件数据,通过 xhr 的方式提交到对应的url上传链接。 构造 FormData 对象的方式,适用于以上4种文件读取方式,只要获取到文件信息,就可以通过这种方式上传到服务器。

总结

本文总结了前端web当前能够添加读取文件的4种方式,如果我们需要开发一个比较完善的图片上传组件,那么可能需要点击、拖拽、粘贴多种功能,这就需要使用到前三种文件读取方式。文件系统访问API鉴于兼容性还有待提升,我们可以作为后备的方案使用。 有了文件读取的方式,那我们要完成上传功能,就可以使用 HTML表单 提交,或者 FormData 对象上传了。

本文链接地址:https://www.jiuchutong.com/zhishi/288865.html 转载请保留说明!

上一篇:梵净山,中国西南部 (© zhuxiaophotography/Shutterstock)(梵净山原名)

下一篇:[Web安全入门]BURP基本使用详解(web安全如何入门)

  • 中继器怎么连接wifi(中继器)(小米中继器怎么连接)

    中继器怎么连接wifi(中继器)(小米中继器怎么连接)

  • canon相机怎么导出照片(canon相机怎么导出照片到安卓手机)

    canon相机怎么导出照片(canon相机怎么导出照片到安卓手机)

  • 荣耀v30pro是曲屏还是直面屏呢(荣耀v30pro曲屏度数)

    荣耀v30pro是曲屏还是直面屏呢(荣耀v30pro曲屏度数)

  • 机械键盘个别键位失灵(机械键盘个别键手感不同)

    机械键盘个别键位失灵(机械键盘个别键手感不同)

  • 苹果x要不要升级ios13.4.1

    苹果x要不要升级ios13.4.1

  • 苹果8来电没有声音怎么办(苹果8来电没有声音是怎么回事)

    苹果8来电没有声音怎么办(苹果8来电没有声音是怎么回事)

  • 删除微信好友对方还能加我吗(删除微信好友对方通讯录里还有我吗)

    删除微信好友对方还能加我吗(删除微信好友对方通讯录里还有我吗)

  • 抖音直播可以播放电影吗(抖音直播可以播游戏吗)

    抖音直播可以播放电影吗(抖音直播可以播游戏吗)

  • 华为mate30电量显示怎么设置(华为mate 30手机电量)

    华为mate30电量显示怎么设置(华为mate 30手机电量)

  • ppt全屏播放如何暂停(ppt全屏播放如何退出当前页面)

    ppt全屏播放如何暂停(ppt全屏播放如何退出当前页面)

  • mt7cloo是什么型号(mt7-tl00)

    mt7cloo是什么型号(mt7-tl00)

  • iwatch的gps和蜂窝网络有什么区别吗(iwatch的gps与蜂窝的区别)

    iwatch的gps和蜂窝网络有什么区别吗(iwatch的gps与蜂窝的区别)

  • 抖音里隐藏无效视频是什么意思(抖音里隐藏无效账号)

    抖音里隐藏无效视频是什么意思(抖音里隐藏无效账号)

  • 微信解封一年三次是怎么算的(微信解封一年三次怎么算时间)

    微信解封一年三次是怎么算的(微信解封一年三次怎么算时间)

  • 手机拍照分辨率怎么调(华为手机拍照分辨率)

    手机拍照分辨率怎么调(华为手机拍照分辨率)

  • 电脑微信自启在哪里设置(电脑微信自动启动设置方法)

    电脑微信自启在哪里设置(电脑微信自动启动设置方法)

  • vue怎么加动态字幕(vue动态添加方法)

    vue怎么加动态字幕(vue动态添加方法)

  • 小米平板4什么时候上市的(小米平板4什么时候停产的)

    小米平板4什么时候上市的(小米平板4什么时候停产的)

  • 对方忙线中是拒绝吗(对方忙线中是拒接电话吗)

    对方忙线中是拒绝吗(对方忙线中是拒接电话吗)

  • 封装基板与pcb区别(封装用基板)

    封装基板与pcb区别(封装用基板)

  • 火山小视频怎么没有同城(火山小视频怎么发图片评论)

    火山小视频怎么没有同城(火山小视频怎么发图片评论)

  • vivos1支持面部识别吗(vivos1可不可以刷脸解锁)

    vivos1支持面部识别吗(vivos1可不可以刷脸解锁)

  • 拼多多悬浮窗怎么关(拼多多悬浮窗怎样关闭)

    拼多多悬浮窗怎么关(拼多多悬浮窗怎样关闭)

  • 智慧团建忘记密码该如何操作(智慧团建忘记密码也不知道组织关系在哪里)

    智慧团建忘记密码该如何操作(智慧团建忘记密码也不知道组织关系在哪里)

  • iphonexr耗电严重原因(iphonexr 耗电)

    iphonexr耗电严重原因(iphonexr 耗电)

  • 怎么消除别人微博水印(怎么消除别人微信)

    怎么消除别人微博水印(怎么消除别人微信)

  • 小米8自动开关机怎么设置(小米8自动开关机怎么关)

    小米8自动开关机怎么设置(小米8自动开关机怎么关)

  • Linux系统中配置和获取无线网卡信息的命令用法(linux系统中配置网卡ip地址的命令为)

    Linux系统中配置和获取无线网卡信息的命令用法(linux系统中配置网卡ip地址的命令为)

  • 5个 ChatGPT 功能,帮助你提升日常编码效率

    5个 ChatGPT 功能,帮助你提升日常编码效率

  • WordPress配置全站HTTPS教程(基于宝塔面板)(wordpress站点地址如何设置)

    WordPress配置全站HTTPS教程(基于宝塔面板)(wordpress站点地址如何设置)

  • 买车库需要交税吗
  • 交易性金融资产属于什么科目
  • 委托加工物资的会计科目
  • 纳税申报表保留几年
  • 不抵扣勾选怎么撤销
  • 装修费用税法规定
  • 小规模纳税人能用专票抵税吗
  • 抵扣白条账单是怎么回事
  • 税种认定网上操作流程
  • 核定征收企业有哪些
  • 短期筹资方式有没有股票
  • 固定资产年数总额法
  • 其他收益科目账务处理
  • 营改增对小规模的影响
  • 城市维护建设税是什么意思
  • 查补以前年度所得税如何填写申报表
  • 递延收益在资产负债表哪里列示
  • 支付微信收款放在哪里
  • 印花税的基数及标准是多少?
  • 工会经费电子税务局找不见了
  • 营改增后餐饮业税种
  • 增值税发票红冲后增值税销项为负数
  • 业务招待费增值税是进项税吗
  • 股权变更之后税务变更
  • 什么是小型微利企业标准2023
  • 企业收入代扣税金应该怎么做会计处理?
  • 在电脑上呢
  • 冲回坏账
  • 为什么电脑连上蓝牙耳机却是外放
  • 银行电子承兑到期了怎么兑现操作
  • win11系统咋样
  • 电脑硬盘数据恢复一般需要收费多少钱
  • springboot+vue+elementsUI 实现分角色注册登录界面
  • 哪些收入不纳税
  • 预测编码方式
  • 峡谷的人
  • php创建视图
  • php读取mysql
  • 减免税费是几级科目
  • vue中遇到的问题
  • ros入门21讲
  • 长期借款利息的账务处理涉及的会计科目有
  • php接口技术
  • modulenotfounderror
  • 如何把握售后租回交易的主要问题
  • 增值税怎么算出来的
  • 办公费用的核算方法
  • 债权转让收益需缴税吗
  • 农业种植公司有补贴吗
  • 电子发票税率怎么改
  • 预提费用做账的会计分录
  • js array()
  • 网络编程知识
  • python中@是什么意思
  • 关闭论坛
  • 新建账簿的具体步骤
  • 一般纳税人招待费扣除标准
  • PostgreSQL教程(九):事物隔离介绍
  • mongodb重置密码
  • 公司帐户转到法人私卡备用金行吗
  • 预期报酬率和期初报酬率
  • 起征点和免征额都是税收优惠形式
  • 社保局退回生育津贴分录摘要
  • 废料进口报关
  • 调整事宜
  • 小规模纳税人购进商品会计分录
  • mysql按时间查询
  • win8系统连接网络
  • centos7版本推荐
  • windows2008输入法
  • js声明集合
  • 获取jquery对象
  • python闭包的条件
  • java教程 视
  • python3新增特性
  • 注册资金实缴证明怎么出
  • 设计服务税收分类编码
  • 税务延期申报最长多久
  • 国地税发展历程
  • 南京税务局举报
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设