最新HTML5中的文件详解

news2024/9/20 7:49:24

第5章 HTML5中的文件

5.1选择文件

可以创建一个file类型的input,添加multiple属性为true,可以实现多个文件上传。

5.1.1 选择单个文件

1.功能描述

创建file类型input元素,页面中不再有文本框,而是 选择文件 按钮,右侧是上次文件的名称,

初始化时没有上传文件,只显示未选择文件字样,可以选择一个图片文件。

2.实现代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
    <form id="frmTmp" action="#">
        <fieldset>
            <legend>上传单个文件:</legend>
            <input type="file" name="feUpload" id="feUpload" />
        </fieldset>
    </form>
</body>
</html>
3.页面效果

4.源码分析

本例中,单击选择文件后,没编写JS代码,就可以选择文件名称。

5.1.2 选择多个文件

1.功能描述

创建file类型input,添加multiple属性为true,单击选择文件,同时选择3个文件,点击打开按钮后,在按钮右侧会显示这个三个文件的字样,移动鼠标至文字上,显示详细名称和类型。

2.实现代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
    <form id="frmTmp" action="#">
        <fieldset>
            <legend>上传多个文件:</legend>
            <input type="file" multiple="true" name="feUpload" id="feUpload" />
        </fieldset>
    </form>
</body>
</html>
4.源码分析

选择文件后,不在显示文件名称,而是显示成功选择文件的数量,鼠标浮动上面显示全部上传文件详细列表。

5.1.3 使用Blob接口获取文件的类型和大小

Blob(Binary Large Object二进制大对象),表示二进制数据块,Blob接口提供slice方法,可以访问指定长度和类型的字节内部数据块。接口有两个属性,size表示返回的数据块大小,type表示数据块的MIME类型。

1.功能描述

file类型的input元素,multiple属性设为true,选择文件按钮,选取多个文件,页面将以列表的形式展示所选文件名称,类型,大小信息。

2.实现代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script>
            function $$(id){
                return document.getElementById(id);
            }
            function getFileList(files){
                var strLi = "<li class='li'>";
                strLi=strLi + "<sapn>文件名称</span>,";
                strLi=strLi + "<sapn>文件类型</span>,";
                strLi=strLi + "<sapn>文件大小</span>";
                strLi=strLi + "</li>";
                for(var i=0;i<files.length;i++){
                    var tmpFile = files[i]
                    strLi=strLi+"<li>";
                    strLi=strLi + "<sapn>"+tmpFile.name+"</span>,";
                    strLi=strLi + "<sapn>"+tmpFile.type+"</span>,";
                    strLi=strLi + "<sapn>"+tmpFile.size+"KB</span>";
                    strLi=strLi + "</li>";
                }
                $$("ulUpload").innerHTML = strLi;
            }
        </script>
    </head>
    <body>
        <form id="frmTmp"  action="#">
            <fieldset>
                <legend>上传多个文件:</legend>
                <input type="file" onchange="getFileList(this.files)" 
                    multiple="true" name="feUpload" id="feUpload" />
                <ul id="ulUpload"></ul>
            </fieldset>
        </form>
    </body>
</html>
3.页面效果

4.源码分析

fie类型input选择上传时,触发onChange事件,调用自己定义的getFileList函数,实参是当前文件列表,获取单个文件,返回名称,类型,大小信息,并拼接到strLi中,赋值给ulUpload列表。

5.1.4 通过类型过滤选择文件

1.功能描述

选择多个文件,点击选择文件后,选取文件中存在不符合图片类型的文件,将在页面中显示总数量与文件名称。

2.实现代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <script>
        function $$(id) {
            return document.getElementById(id);
        }
        function checkFileType(files) {
            var strP = "", strN = "", j = 0
            var strFileType = /image.*/;
            for (var i = 0; i < files.length; i++) {
                var tmpFile = files[i]
                if (!tmpFile.type.match(strFileType)) {
                    j = j + 1;
                    strN = strN + tmpFile.name + "<br>"
                }
            }
            strP = "检测到(" + j + ")个非图片格式文件.";
            if (j > 0) {
                strP = strP + "文件名如下:<p>" + strN + "</p>";
            }
            $$("pTip").innerHTML = strP;
        }
    </script>
</head>
<body>
    <form id="frmTmp" action="#">
        <fieldset>
            <legend>上传过滤类型后的文件:</legend>
            <input type="file" onchange="checkFileType(this.files)" multiple="true" name="feUpload" id="feUpload" />
            <p id="pTip"></p>
        </fieldset>
    </form>
</body>
</html>
3.页面效果

4.源码分析

以上代码中file对象返回的类型与image正则匹配,若不是图片,将内容保存在变量中,将变量内容显示给p段落。

5.1.5 通过accept属性过滤选择文件的类型

1.功能描述

表单中创建file类型input元素,并在元素中添加accept属性,属性值设为image/gif。

当用户单击选择文件按钮时,选择窗口中,文件类型为accept的值。

accept 属性支持的MIME类型包括但不限于:

  • ‌图片文件‌:image/jpeg、image/png、image/gif等。
  • ‌音频文件‌:audio/mp3、audio/wav等。
  • ‌视频文件‌:video/mp4等。
2.实现代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>通过accept属性过滤某类型上传文件</title>
</head>
<body>
    <form id="frmTmp" action="#">
        <fieldset>
            <legend>选择某类型上传文件:</legend>
            <input type="file" accept="image/png" name="feUpload" id="feUpload" />
        </fieldset>
    </form>
</body>
</html>
3.页面效果

4.源码分析

这种方法过滤所选文件类型简单方便,但是不是很有效,及时设置了,不是该类型的元素同样会被选中,也能被文件元素接受,最好的方式是js或者后端再一次进行验证 。

5.2 使用FileReader接口读取文件

使用Blob接口可以获取文件相关信息,如文件名称,大小,类型。

如果需要读取和浏览文件,则需要通过FileReader接口。

该接口不仅可以读取图片文件,还可以读取文本或二进制文件,根据接口提供的事件和方法动态侦查文件的详细状态。

5.2.1 FileReader接口的方法

FileReader提供异步API,可以从浏览器主线程中异步访问文件系统中数据。

读取文件中数据并存入内存中。

访问不同文件,有多个对象,常用方法:

方法名称

参数

功能描述

使用说明

readAsBinaryString()

file

以二进制方式读取文件内容

调用时,将file对象返回的数据块以二进制字符串形式分块读入内存中

readAsArrayBuffer()

file

以数组缓冲的方式读取

调用时,将file对象返回的字节数以数组缓冲的方式读入内存中

readAsDataURL()

file

以数据URL的方式读取

调用时,将file对象返回的数据块以一串数据URL字符形式展现在页面中,通常是较小的文件

readAsText()

file,encoding

以文本编码方式读取

调用时,以编码方式读取数据块按文本方式读入内存中,通常是UTF-8

abort()

读取数据中止时自动触发

如果读取过程中出现错误和异常触发该方法,返回错误信息

5.2.2 使用readAsDataURL方法预览图片

通过此方法可以获取API异步读取的文件数据,另存为数据URL,将URL绑定元素的src属性,可以说实现文件预览效果。

1.功能描述

表单中添加file类型的input元素,设置属性multiple为true,单击选择文件后如果选择图片文件,将在页面中显示。

2.实现代码
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>5.2.2 使用readAsDataURL方法预览图片</title>
    <style>
        * {
            list-style-type: none;
        }
    </style>
    <script>
        function $$(id) {
            return document.getElementById(id);
        }
        function prevImageFile(files) {
            //检测浏览器是否支持FileReader对象
            if (typeof FileSystem == undefined) {
                alert("检测到您的浏览器不支持FileReader对象!")
            }
            var strHTML = "";
            for (var i = 0; i < files.length; i++) {
                var tmpFile = files[i];
                var reader = new FileReader();
                reader.readAsDataURL(tmpFile);
                reader.onload = function (e) {
                    strHTML = strHTML + "<span>";
                    strHTML = strHTML + "<img width='60px' height='100px' style='margin:0 5px;' src='" + e.target.result + "'/>";
                    strHTML = strHTML + "</span>";
                    $$("ulUpload").innerHTML = "<li>" + strHTML + "</li>"
                }
            }
        }
    </script>
</head>

<body>
    <form id="frmTmp" action="#">
        <fieldset>
            <legend>预览图片文件:</legend>
            <input type="file" multiple="true" onchange="prevImageFile(this.files)" name="feUpload" id="feUpload" />
            <ul id="ulUpload"></ul>
        </fieldset>
    </form>
</body>

</html>
3.页面效果

4.源码分析

图片预览过程实质上是图片文件被读取后展示在页面中的过程,考虑到兼容性,先判断浏览器是否支持。

每个文件以URL方式读入页面中,读取成功触发onload事件,通过result属性过去url地址绑定给img元素,

最后通过ul的ID展示到页面中,实现预览效果。

5.2.3 使用readAsText方法读取文本文件

FileReader接口中的readAsText()方法可以将文件以文本编码的方式进行读取,可以读取文本文件的内容。

1.功能描述

表单中添加file类型的input元素,单击选择文件后如果选择文本文件,将在页面中显示文本文件的内容。

2.实现代码
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>使用fileReader方法读取文本文件</title>
    <script>
        function $$(id) {
            return document.getElementById(id);
        }
        function readTextFile(files) {
            //检测浏览器是否支持FileReader对象
            if (typeof FileSystem == undefined) {
                alert("检测到您的浏览器不支持FileReader对象!")
            }
            var tmpFile = files[0];
            var reader = new FileReader();
            reader.readAsText(tmpFile);
            reader.onload = function (e) {
                $$("artShow").innerHTML = "<pre>" + e.target.result + "</pre>";
            }
        }
    </script>
</head>

<body>
    <form id="frmTmp" action="#">
        <fieldset>
            <legend>读取文本文件:</legend>
            <input type="file" onchange="readTextFile(this.files)" name="feUpload" id="feUpload" />
            <article id="artShow"></article>
        </fieldset>
    </form>
</body>

</html>
3.页面效果

4.源码分析

先检测浏览器是否支持FileReader对象,创建一个对象,调用readAsText()方法,

以文本的编码方式读入页面,通过result获取读入的内容,并赋给artShow元素,

同时显示在页面中。

5.2.4 侦听FileReader接口中的事件

FIleReader提供很多常用的事件,可以清晰侦听对象读取文件详细过程(生命周期),常用事件如下:

  • onloadstart 当读取数据开始时触发
  • onprogress 正在读取时触发
  • onabort 读取中止时触发
  • onerror 读取失败时触发
  • onload 读取成功时触发
  • onloadend 请求成功后,无论读取结果如何都触发

正常读取触发的先后顺序:onloadstart-onprogress-onload-onloadend

想要正确获取文件数据,必须在onload中编写代码。

1.功能描述

file类型input点击选择文件选取文件,页面将展示读取文件过程所触发事件的内容。

2.实现代码
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>展示文件读取时触发事件的先后顺序</title>
    <script>
        function $$(id) {
            return document.getElementById(id);
        }
        function showEvent(files) {
            //检测浏览器是否支持FileReader对象
            if (typeof FileSystem == undefined) {
                alert("检测到您的浏览器不支持FileReader对象!")
            }
            var tmpFile = files[0];
            var reader = new FileReader();
            reader.readAsText(tmpFile);
            reader.onload = function (e) {
                var newLi = document.createElement('li');
                newLi.textContent = "数据读取成功!";
                $$("olStatus").appendChild(newLi)
            }
            reader.onloadstart = function (e) {
                var newLi = document.createElement('li');
                newLi.textContent = "开始读取数据。。。";
                $$("olStatus").appendChild(newLi)
            }
            reader.onloadend = function (e) {
                var newLi = document.createElement('li');
                newLi.textContent = "文件读取成功";
                $$("olStatus").appendChild(newLi)
            }
            reader.onprogress = function (e) {
                var newLi = document.createElement('li');
                newLi.textContent = "正在读取数据。。。";
                $$("olStatus").appendChild(newLi)
            }
        }
    </script>
</head>

<body>
    <form id="frmTmp" action="#">
        <fieldset>
            <legend>展示文件读取时触发事件的先后顺序:</legend>
            <input type="file" onchange="showEvent(this.files)" name="feUpload" id="feUpload" />
            <ol id="olStatus"></ol>
        </fieldset>
    </form>
</body>

</html>
3.页面效果

4.源码分析

本例中,单击选择文件,触发自定义函数showEvent(),先检测是否浏览器知否支持FileReader对象,

以文本编码的方式读入页面,通过排序列表ul中添加li来看哪个事件先触发,整个排序就是事件触发的顺序。

5.3 使用DataTransfer对象拖放上传图片文件

DataTransfer对象中提供方法,实现浏览器和其他应用程序之间文件的拖动。

1.功能描述

页面表单中,创建一个

  • 元素,用于接收并预览拖入的图片文件。

选择图片文件拖动的方式将文件放入该元素内,并以预览的方式显示。

2.实现代码
3.页面效果
4.代码分析

5.4 文件读取时的错误和异常

文件读取过程中,出现错误和异常,通过FileError对象获取错误与异常。

1.功能描述

出错时,触发onerror事件。

2.错误代码说明
  • NOT_FOUND_ERR 文件无法找到或原文件已被修改
  • SECURITY_ERR 出于安全的考虑,无法获取数据文件
  • ABORT_ERR 触发了abort事件,中止文件读取的过程
  • NOT_READABLE_ERR 由于权限原因,不能获取数据文件
  • ENCODING_ERR 读取文件太大,超出读取时地址的限制

如果案例无法动态显示,直接看笔记

【有道云笔记】《HTML5实战》https://note.youdao.com/s/KjHV02fO

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

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

相关文章

中秋将至,邮寄中秋礼品怎么才安心?

中秋节&#xff0c;是中华民族的传统佳节&#xff0c;承载着人们对团圆的期盼和对亲人的思念。在这个温馨的节日里&#xff0c;中秋礼品成为了许多人传递情感的方式。 在这个数字化的时代&#xff0c;虽然一通电话、一个视频就能拉近人与人之间的距离&#xff0c;但一份实实在在…

Autoware 定位之初始姿态输入(九)

0. 简介 这一讲按照《Autoware 技术代码解读&#xff08;三&#xff09;》梳理的顺序&#xff0c;我们来说一说Autoware中的初始化操作&#xff0c;这个软件包当中完成了ekf_localizer发送初始姿态的包。它接收来自GNSS/用户的粗略估计的初始姿态。将姿态传递给ndt_scan_match…

Linux 删除虚拟环境命令

查看当前都有哪些虚拟环境 # conda info --env 删除虚拟环境 py311 conda remove -n py311 --all

【Canvas与钟表】干支表盘

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>387.干支表盘</title><style type"text/css">…

热门宠物空气净化器测评,希喂、小米空气净化器真实测试对比

随着宠物在家庭中占据越来越重要的地位&#xff0c;如何保持家中空气的清新成为了许多铲屎官关注的重点。市面上的宠物空气净化器琳琅满目&#xff0c;其中希喂和小米两款产品备受关注。今天我们就从外观设计、功能性、滤芯效果、噪音控制和性价比五个方面&#xff0c;来为大家…

2024 9月最新PyCharm下载安装教程(详细步骤)附激活码!

PyCharm安装教程 一、软件简介 PyCharm是一款Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如&#xff0c; 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外&#xff0c;…

设计模式-行为型模式-迭代器模式

1.迭代器模式的定义 迭代器模式提供一种对容器对象中的各个元素进行访问的方法&#xff0c;而不需要暴露该对象的内部细节&#xff1b; 在软件系统中&#xff0c;容器对象有两个职责&#xff1a;一是存储数据&#xff0c;二是遍历数据&#xff1b;从依赖性上看&#xff0c;前者…

C语言代码练习(第十六天)

今日练习&#xff1a; 40、编写程序&#xff0c;用 getchar 函数读入两个字符给c1和c2&#xff0c;然后分别用 putchar 函数和 printf 函数输出这两个字符。 41、输入4个整数&#xff0c;要求按由小到大的顺序输出。 42、有4个圆塔&#xff0c;圆心分别为&#xff08;2.2)、(-2…

笔记 13 : 彭老师课本第 8 章, UART ,概念,帧格式 , 工作原理,模块介绍,查看原理图 与 datasheet ,GPIO 组态 ,寄存器介绍

&#xff08;94&#xff09; 开始学习通信。通信谢意要考虑时钟同步&#xff0c;是否双工通信&#xff0c;并行或串行通信等等&#xff1a; 低速协议用 uart &#xff0c; iic &#xff0c; spi &#xff0c; 高速协议用 pci 。can 总线支持远距离传输&#xff0c;如门禁&a…

Cursor 使用 One API 配置 Anthropic Claude BaseURL 代理指南

背景 Cursor IDE 原生只支持配置 ChatGPT 的 API Base URL,无法直接使用 Anthropic Claude 的 API。 本指南将介绍如何通过One API来解决这个问题,实现在Cursor中使用Claude API。 前置条件 部署One API https://github.com/songquanpeng/one-api 获取Anthropic Claude A…

做运营,发布时间很重要

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/#1 作为社交网络与媒体行业的内容运营&#xff0c;我常常被以下问题困扰&#xff1a;用户活跃时间难以预测、内容策划时间紧张、跨平台管理复杂、数据分析繁琐、创意枯竭…

力扣 797. 所有可能路径【DFS】

1. 题目 2. 代码 DFS &#xff0c; 直接见代码 class Solution { public:vector<int> path;vector<vector<int>> res; // 结果集void dfs(vector<vector<int>>& graph, int cur, int n){// 找出所有从节点 0 到节点 n-1 的路径// 下标从 …

深入解析 Dubbo 的 attachments 机制及其应用场景

背景 在分布式系统中&#xff0c;服务之间的调用&#xff08;RPC调用&#xff09;是非常常见的。而在这种服务调用过程中&#xff0c;常常需要在不同服务之间传递一些上下文信息&#xff0c;比如用户身份信息、请求追踪ID、客户端IP等。Dubbo 提供的 attachments 机制&#xf…

SysML图例-洗衣机

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 对于许多学习SysML和MBSE的同学来说&#xff0c;比较头痛的问题之一是&#xff1a; 各种各样的教程里给出的案例&#xff0c;图都是画好了的&#xff01;如何从零开始用建模…

LTspice模拟CCM和DCM模式的BUCK电路实验及参数计算

关于BUCK电路的原理可以参考硬件工程师炼成之路写的《 手撕Buck&#xff01;Buck公式推导过程》.实验内容是将12V~5V的Buck电路仿真,要求纹波电压小于15mv. CCM和DCM的区别: CCM:在一个开关周期内&#xff0c;电感电流从不会到0. DCM:在开关周期内&#xff0c;电感电流总会到0.…

缓存类型以及读写策略

缓存&#xff08;Cache&#xff09;是一种高效的数据存储技术&#xff0c;旨在提高数据访问速度。 它将频繁访问或最近使用的数据临时存储在更快速但较小的存储介质&#xff08;如内存&#xff09;中&#xff0c;以减少从较慢的存储设备&#xff08;如硬盘或远程服务器&#x…

聊一聊大型网站稳定性建设思路

目录 架构阶段的稳定性建设项目 编码阶段的稳定性建设 测试阶段的稳定性建设 发布阶段的稳定性建设 运行阶段的稳定性建设项目 故障发生时的稳定性建设 网站稳定性的建设是一项综合的系统工程&#xff0c;就像人的健康一样&#xff0c;如果平时不注意健康饮食、不注意锻炼…

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路&#xff0c;我们用栈来存1234.....&#xff0c;队列来存输入的一组数据&#xff0c;栈与队列进行匹配&#xff0c;相同就pop 机翻 1、条件准备 stk是栈&#xff0c;que是队列。 tt指向的是栈中下标&#xff0c;fr…

C++入门(05-2)从命令行执行C++编译器_GCC

文章目录 GCC编译器1. 下载MinGW-w64&#xff0c;安装&#xff08;不推荐&#xff09;2. 使用MSYS2安装MinGW-w64&#xff08;推荐&#xff09;2.1 安装MSYS22.2 初始化和更新2.3 安装MinGW-w64编译器2.3 在MSYS2 Shell中导航到代码目录2.4 使用 g 编译2.5 运行可执行文件 GCC编…

【Qt】qt发布Release版本,打包.exe可执行文件

前言&#xff1a;Qt编译的可执行程序&#xff0c;如果直接运行&#xff0c;会出现0xc000007b报错&#xff0c;或者“由于占不到Qt5Network.dll,无法继续执行代码。重新安装程序可能会解决此问题”的报错&#xff0c;因为缺少相关的依赖包和动态库。 1、第一步&#xff1a;找到…