原生js多文件本地上传预览

2024-06-12 15:48
文章标签 js 本地 预览 上传 原生

本文主要是介绍原生js多文件本地上传预览,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引子

<input> type 类型为 file 的 input 元素使得用户可以选择一个或多个元素以提交表单的方式上传到服务器上,或者通过 Javascript 的 File API 对文件进行操作 。

语法

属性说明
ValueDOMString 选择文件的路径
事件change 事件 input
支持的常用属性accept, multiple, required
IDL 属性文件 和 值
方法select()
  • 解释
    文件输入的 value 属性包括了一个 value 表示选择文件的路径DOMString。如果用户选择了多个文件,则该值表示他们选择的文件列表中的第一个文件。 可以使用输入的HTMLInputElement.files属性标识其他文件

  • 提示

  1. 如果选择了多个文件, 这个值表示第一个被选择的文件路径。JavaScript 可以通过 Input 的 FileList属性获取到其他的文件路径。
  2. 没有选择文件该值为空字符串。
  3. 为了阻止恶意软件猜测文件路径, 该值 以 C:\fakepath\为前缀。

使用

包括上面所说的 multiple 属性, 多个文件可以被同时选中. 只要用户所在的平台允许 (e.g. 摁住 Shift 或者 Control), 用户可以选择多个文件. 如果不希望多选, 忽略 multiple 属性.

在上面的例子中, 当表单被提交, 每个选中的文件名将被添加到 URL 参数中?file=file1.txt&file=file2.txt

获取选中文件信息
  • 选中文件通过 HTMLInputElement.files 属性返回 — 返回值是一个 FileList 对象,这个对象是一个包含了许多 File 文件的列表(你也可以想列表一样操作它).

  • 每个 File 对象包含了下列信息:

name: 文件名.
lastModified: UNIX timestamp 形式的最后修改时间.
lastModifiedDate: Date 形式的最后修改时间.
size: 文件的字节大小.
type: DOMString 文件的 MIME 类型.

限制允许的文件类型

accept 属性接受一个逗号分隔的 MIME 类型字符串, 如:

accept="image/png" or accept=".png" — 只接受 png 图片.
accept="image/png, image/jpeg" or accept=".png, .jpg, .jpeg" — PNG/JPEG 文件.
accept="image/*" — 接受任何图片文件类型.
accept=".doc,.docx,.xml,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document" — 接受任何 MS Doc 文件类型.
下面是一个更完整的例子:

示例代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>multiple file uploade</title>
</head><body><h4>多文件上传</h4><p>使用 opacity 而不是 visibility: hidden / display: none的原因是因为visibility和display会让input不可选择</p><form><div><label for="image_uploads">点击选择多图片上传 (PNG, JPG)</label><input type="file" id="image_uploads" name="image_uploads" accept=".jpg, .jpeg, .png" multiple></div><div class="preview"><p>No files currently selected for upload</p></div><div><button>Submit</button></div></form><script>// 获取 input 元素var input = document.querySelector('input');// 获取 preview 元素var preview = document.querySelector('.preview');// 将 input 变成透明的input.style.opacity = 0;// 监听 input 的 change 事件input.addEventListener('change', updateImageDisplay);// 监听函数function updateImageDisplay() {// while 循环清空 preview 中的内容. while (preview.firstChild) {preview.removeChild(preview.firstChild);}// 获取 FileList 对象并且将选中文件保存到 curFiles 变量中var curFiles = input.files;// 检查是否没有选中文件if (curFiles.length === 0) {var para = document.createElement('p');para.textContent = 'No files currently selected for upload';preview.appendChild(para);} else {// 创建有序列表var list = document.createElement('ol');preview.appendChild(list);for (var i = 0; i < curFiles.length; i++) {var listItem = document.createElement('li');var para = document.createElement('p');//检查文件类型是否正确if (validFileType(curFiles[i])) {// 在 div 中打印文件名称和 sizepara.textContent = 'File name ' + curFiles[i].name + ', file size ' + returnFileSize(curFiles[i].size) + '.';// 通过 window.URL.createObjectURL(curFiles[i]) 以及 css 产生预览图.var image = document.createElement('img');// 生成blob对象image.src = window.URL.createObjectURL(curFiles[i]);listItem.appendChild(image);listItem.appendChild(para);} else {// 不正确则将结果告知用户para.textContent = 'File name ' + curFiles[i].name +': Not a valid file type. Update your selection.';listItem.appendChild(para);}list.appendChild(listItem);}}}// 自定义的 validFileType() 接受一个 File 对象作为参数, 然后检查文件类型是否在 accept 列表中.var fileTypes = ['image/jpeg','image/pjpeg','image/png']// 验证文件类型function validFileType(file) {for (var i = 0; i < fileTypes.length; i++) {if (file.type === fileTypes[i]) {return true;}}return false;}// returnFileSize()方法接受一个数字作为参数以 KB/MB 的形式返回结果.function returnFileSize(number) {if (number < 1024) {return number + 'bytes';} else if (number > 1024 && number < 1048576) {return (number / 1024).toFixed(1) + 'KB';} else if (number > 1048576) {return (number / 1048576).toFixed(1) + 'MB';}}</script>
</body></html>

这篇关于原生js多文件本地上传预览的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054650

相关文章

input的accept属性让文件上传安全高效

《input的accept属性让文件上传安全高效》文章介绍了HTML的input文件上传`accept`属性在文件上传校验中的重要性和优势,通过使用`accept`属性,可以减少前端JavaScrip... 目录前言那个悄悄毁掉你上传体验的“常见写法”改变一切的 html 小特性:accept真正的魔法:让

java对接Pinata上传文件到IPFS全过程

《java对接Pinata上传文件到IPFS全过程》本文详细介绍了如何使用PinataAPI将文件上传到IPFS网络,首先登录Pinata官网并生成JWT令牌,然后在项目中导入OkHttp依赖并编写代... 目录1.登录2.生成令牌3.导入依赖4.编写代码5.调用接口调试China编程代码总结Pinata调用AP

MyBatis Plus中执行原生SQL语句方法常见方案

《MyBatisPlus中执行原生SQL语句方法常见方案》MyBatisPlus提供了多种执行原生SQL语句的方法,包括使用SqlRunner工具类、@Select注解和XML映射文件,每种方法都有... 目录 如何使用这些方法1. 使用 SqlRunner 工具类2. 使用 @Select 注解3. 使用

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4