前端浏览器支持的JS文件操作技术介绍

news2024/11/23 5:04:18

前端浏览器支持的JS文件操作技术介绍

本文将介绍前端浏览器支持的JS文件操作技术。通过使用在 HTML5 中加入到 DOM 的 File API,使在 web 内容中让用户选择本地文件然后读取这些文件的内容成为可能。用户可以通过 HTML 中的 <input type="file"> 元素或者是通过拖拽来选择本地文件。

相关权威技术资料

在 web 应用程序中使用文件在 web 应用程序中使用文件 - Web API 接口参考 | MDN

带有 type="file" 的 <input> 元素允许用户可以从他们的设备中选择一个或多个文件。<input type="file"> - HTML(超文本标记语言) | MDN

FileReader 是HTML5新增的,其中FileReader API负责读取文件内容,FileSystem API负责本地文件系统的有限操作。FileReader - Web API 接口参考 | MDN

Node.js 中的文件系统,功能强大,Node.js是服务端网页编程技术,需要安装,在此不涉及,可参见其官网的相关部分File system | Node.js v19.2.0 Documentation

Node.js 提供额外的 API 用于支持在无浏览器环境中有用的功能,例如,创建 HTTP 服务器并访问文件系统,但不支持 DOM。

【特别提醒新手注意,ActiveXObject对象和FileSystemObject 对象仅在IE浏览器中实现文件的操作功能,微软已于2021年停止支持IE浏览器,属于淘汰技术,故不涉及】

显示图片方面的应用

HTML页面显示图片比较简单,html显示图片的基本方法:使用img标签,语法“<img src="图片文件地址" /> ”;

使用img标签插入图片

在HTML中,可以使用img 元素向网页中嵌入一幅图像。示例源码如下:

<!DOCTYPE html>
<html lang="zh">
    <head>
	<meta charset="utf-8">
        <title> 测试</title>
    </head>
    <body>
        <img src="./雪.png" width="250"/>
    </body>
</html>

保存文件名为:图片.html,用浏览器打开显示效果如下:

这样的方法,图片不能更换,如何由用户打开对话框选定图片显示呢?这就需要JS文件操作技术了。

带有 type="file" 的 <input> 元素允许用户可以从他们的设备中选择文件。还可以用 accept 属性指定可接受的文件类型,它是一个以逗号间隔的文件扩展名和 MIME 类型列表。例如图像格式:accept=".png, .jpg, .jpeg"

示例源码如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>选图显示</title>
</head>
<body>
  <input type="file" id="file" accept=".png, .jpg, .jpeg" onchange="showPreview(this, 'portrait')" />
  <img src="" id="portrait" style="width: 200px;  display: block;" />
  <script>
  function showPreview(source, imgId) {
    var file = source.files[0];
    if(window.FileReader) {
      var fr = new FileReader();
      fr.onloadend = function(e) {
        document.getElementById(imgId).src = e.target.result;
      }
      fr.readAsDataURL(file);
    }
  }
  </script>
</body>
</html>

 保存文件名为:选定显示图片.html,用浏览器打开显示效果如下:

文本文件方面的应用

例1

例子中,创建了一个 file 类型的输入字段,它允许我们提供一个文件作为输入。然后指定一个 <pre> 标签显示读取的文件内容。被包围在 <pre> 标签中的文本通常会保留空格和换行符。本例用到了async 函数(异步函数、async function)详见async 函数 - JavaScript | MDN

源码如下:

<!DOCTYPE html>
<html>
  <head>
    <title>Read Text File Tutorial</title>
  </head>
  <body>
    <input type="file" onchange="loadFile(this.files[0])">
    <br>
    <pre id="output"></pre>
    <script>
      async function loadFile(file) {
        let text = await file.text();
        document.getElementById('output').textContent = text;
      }
    </script>
  </body>
</html>

保存文件名为:读入文本文件示例1.html,用浏览器打开显示效果如下:

例2

例子中,使用file 类型的输入字段<input type="file" id="file" />来选择所需的文件。使用 <pre> 标签显示读取的文件内容,被包围在 <pre> 标签中的文本通常会保留空格和换行符。

输入字段由 getElementById 方法选择,该方法将在更改时触发该函数(无论何时选择文件)。我们创建对象 FileReader() 的新实例。当实例 reader.onload 被触发时,一个带有参数 progressEvent 的函数被调用,在控制台上将文件的全部内容打印为 console.log(this.result),也可在页面中将文件的内容输出document.getElementById('output').textContent = this.result。本例用到了FileReader。

源码如下:

<!DOCTYPE html>
<html>
  <head>
    <title>Read Text File Tutorial 2</title>
  </head>
  <body>
    <input type="file" id="file" accept=".txt"/>
    <br>
    <pre id="output"></pre>
    <script>
    document.getElementById('file').onchange = function(){
       var file = this.files[0];
       var reader = new FileReader();
       reader.onload = function(progressEvent){
          console.log(this.result);
          document.getElementById('output').textContent = this.result;
       };
       reader.readAsText(file);
    };
    </script>
  </body>
</html>

 保存文件名为:读入文本文件示例2.html,用浏览器打开显示效果类似上图。

例3

修改上例的函数,实现逐行读取文件内容,使用 split() 来拆分 result 变量读取的内容并将其存储到数组 fileContentArray 变量中。然后使用 for 循环遍历 fileContentArray的每一行逐行处理文件内容。源码如下:

<!DOCTYPE html>
<html>
  <head>
    <title>Read Text File Tutorial 3</title>
  </head>
  <body>
    <input type="file" name="file" id="file" accept=".txt"/>
    <br>
    <pre id="output"></pre>
    <script>
    document.getElementById('file').onchange = function(){
        var file = this.files[0];
        var reader = new FileReader();
        var s="";
        reader.onload = function(progressEvent){    
            var fileContentArray = this.result.split(/\r\n|\n/);
            for(var line = 0; line < fileContentArray.length-1; line++){
                console.log(fileContentArray[line]);
                s = s + fileContentArray[line] + "\n";
            }
            document.getElementById('output').textContent = s; 
        };
        reader.readAsText(file);
     };
    </script>
  </body>
</html>

保存文件名为:读入文本文件示例3.html,用浏览器打开显示效果类似上图。

例3讲到的逐行读入看起来比例2麻烦,有何用处呢?看后面“可选定人员名单的随机点名例子”部分。

例4

前面的例子将读出的文本放入<pre> 标签处,还可以放入文本框或多行文本框中。

在HTML中有两种方式的文本框

一是<input>标签的单行文本框,指定type的值为text,通过size属性指定显示字符的长度,value属性指定初始值,Maxlength属性指定文本框可以输入的最长长度,如:

<input type="text" value="" size="10" Maxlength="15">

二是<textarea>的多行文本框,内容可放在<textarea></textarea>标签对中,使用row、col指定大小,如:

<textarea cols="50" rows="10">内容内容内容</textarea>

下面给出将读入文件的内容放入多行文本框中的源码:

<!DOCTYPE html>
<html>
  <head>
    <title>读入入多行文本框</title>
  </head>
  <body>
    读入文件<input type="file" id="file" accept=".txt"/>
    <br>
    <textarea id="output" cols="60" rows="20" readonly="readonly"></textarea>
    <script>
       document.getElementById('file').onchange =function(){
         var file = this.files[0];
         var reader = new FileReader();
         reader.onload = function(progressEvent){    
           var fileContent = this.result;       
           document.getElementById('output').value = fileContent;           
         };
         reader.readAsText(file);
       };
    </script>
  </body>
</html>

保存文件名为:将文本文件读入多行文本框.html,用浏览器打开显示效果如下:

可选定人员名单的随机点名例子

例3讲到的逐行读入用处将在本例中体现。

下面给出的随机点名的例子,可从文本文件中读入人员名单,请准备人员名单文本文件,每人占一行,如:

能读入人员名单的随机点名,源码如下:

<!DOCTYPE html>
<html>
  <head>
    <title>随机点名网页</title>
<style>
  #box {
    width: 30%;
    height: 200px;
    background-color: rgb(233, 248, 214);
    border: 1px solid rgb(130, 216, 18);
    font-size: 40px;
    font-weight: 600;
    font-family: Arial, Helvetica, sans-serif;
    line-height: 200px;
    text-align: center;
    margin: 25px auto;
    border-radius: 10px;
  }
  span {
    display: block;
    width: 30%;
    height: 44px;
    line-height: 44px;
    background-color: rgb(6, 158, 64);
    border-radius: 10px;
    color: #fff;
    text-align: center;
    margin: 0 auto;
    font-size: 18px;
    font-family: 华文细黑;
  }
  span:hover {
    background-color: rgb(4, 190, 76);
  }
</style>

  </head>
  <body>
    人员名单文件<input type="file" id="file" accept=".txt"/>
    <br>
    
    <textarea id="output" cols="29" rows="5" readonly="readonly" ></textarea>
    <div id="box">随机点名</div>
    <span id="span">开始</span>

    <script>

    document.getElementById('file').onchange =function(){
        var file = this.files[0];
        var reader = new FileReader();
        nameArr="";
        reader.onload = function(progressEvent){    
            var fileContentArray = this.result.split(/\r\n|\n/);
            console.log(fileContentArray);
            for(var line = 0; line < fileContentArray.length-1; line++){
                //console.log(fileContentArray[line]);
                if(fileContentArray[line] != ""){
                    nameArr = nameArr + fileContentArray[line] + ",";
                } 
            }
            nameArr = nameArr.slice(0,nameArr.length-1); //删除最后一个字符这里是逗号      
            document.getElementById('output').value = nameArr;
            //console.log(nameArr);
            
        };
        reader.readAsText(file);
     };
   

  var box = document.getElementById("box");
  var span = document.getElementById("span");//获取元素
  var state = 0;//定义状态,开始和结束
  var t;
  span.onclick = function () {
   var  arr = document.getElementById('output').value;  //   
   if (arr =="" ){
       alert("请先读入名单文件");
       return;
   }  
   arr = arr.split(","); //将字符串转为数组
    console.log(arr);
    if (state == 0) {
      //如果是0即开始随机,变为1时结束,不是0时执行else
      clearInterval(t);
      t = setInterval(function () {
        // console.log(1);
        var sj = Math.round(Math.random() * (arr.length - 1));
        //console.log(arr[sj]);
        box.innerHTML = arr[sj];
      }, 3)
      span.innerHTML = "暂停"//更改按钮的内容
      state=1;
    }else{
      state=0;
      clearInterval(t);
      span.innerHTML = "开始"
    }
}
    </script>

  </body>

</html>

保存文件名为:可选定人员名单的随机点名.html,用浏览器打开显示效果如下:

 

OK!

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

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

相关文章

Python动态可视化Plotly

✨ 介绍 Plotly Express ✨&#xff1a; 提示&#xff1a;这里可以添加学习目标 Plotly Express是一个新的高级 Python 可视化库&#xff1a;它是Plotly.py的包装器&#xff0c;为复杂图表提供了简单的语法。受 Seaborn 和 ggplot2 的启发&#xff0c;它专门设计为具有简洁、…

【Meetup 明天见】OpenMLDB + MaxCompute:集成打通云上生态,高效构建 AI 应用

明天上午10&#xff1a;00-12:00&#xff0c;OpenMLDB 第八期 Meetup 将全程线上直播&#xff0c;欢迎关注。 活动背景 数据的爆发式增长为 AI 应用的繁荣提供了坚实的基础&#xff0c;而云服务作为新一代快速整合、高效计算的服务模式&#xff0c;为大数据的分析处理和 AI 智…

MySQL中SQL的执行流程

1 查询缓存 Server 如果在查询缓存中发现了这条 SQL 语句&#xff0c;就会直接将结果返回给客户端&#xff1b;如果没有&#xff0c;就进入到解析器阶段。需要说明的是&#xff0c;因为查询缓存往往效率不高&#xff0c;所以在 MySQL8.0 之后就抛弃了这个功能。 大多数情况查询…

Reconstructing Capsule Networks for Zero-shot Intent Classification

摘要 intent classification 意图分类。dialogue systems 对话系统已经存在的系统并没有能力去处理快速增长的意图。zero-shot intent classifcation&#xff1a; 零样本意图分类。 Nevertheless 不过。 incipient stage 初期阶段 今年来提出的IntentCapsNet two unaddresse…

基于java+springboot+mybatis+vue+mysql的智慧外贸平台

项目介绍 智慧外贸平台能够通过互联网得到广泛的、全面的宣传&#xff0c;让尽可能多的用户了解和熟知智慧外贸平台的便捷高效&#xff0c;不仅为群众提供了服务&#xff0c;而且也推广了自己&#xff0c;让更多的群众了解自己。对于智慧外贸而言&#xff0c;若拥有自己的系统…

播放量超1500w,谁的恰饭两次都在B站成顶流?

- 导语 女性消费一直以来都是消费市场的主力&#xff0c;“她经济”市场应运而生。有关数据显示&#xff0c;我国拥有近4亿消费者为女性&#xff0c;在如此庞大购买力的驱动下&#xff0c;截至目前统计我国共有492.9万家“她经济”相关企业&#xff0c;其中有3/4的是近5年内成…

【Spring】——16、使用@Autowired、@Qualifier、@Primary这三大注解自动装配组件?

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

【Redis】Redis事务工作原理解析与分布式事务实战(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

8.Django大型电商项目之商品添加分页

1.添加分页 添加分页在Django中使用自带分页器paginator 1.1 配置setting settings中配置分页数量 # 每页显示记录条数 PER_PAGE_NUMBER 81.2 配置views 完成分页栏使用paginator创建对象&#xff0c;返回选中条数 from django.shortcuts import render from goodsapp.mo…

桶排序算法

题目 代码1&#xff1a; #include <stdio.h> int main() {int sz0;scanf("%d",&sz);int arr[sz];//输入int i0;for (i0;i<sz;i){scanf("%d",&arr[i]);}//删除多余相同元素int j0;int k0;for (i0;i<sz;i){if (i0){arr[j]arr[i];}else{…

MyBatis批量保存(Oracle)MyBatis批量插入时,组装SQL过长会有问题,一定要根据批量插入数据量进行切割,再批次提交保存!!!

MyBatis批量保存&#xff08;Oracle&#xff09; oracle 批量插入与mysql 的批量插入的方式不同 insert into tablename()values(),(),(); ---这个是mysql 的批量插入形式 insert all into tablename() values() into tablename() values() -------这个是Oracle批量插入形式 你…

大数据测试 - 数仓测试

前言 对于数据仓库的测试来说底层的系统会有很多有自建的集群使用 spark 或者 flink 测试&#xff0c;也有很多直接使用云厂商的产品比如 datworks 等等&#xff0c;再这里我想分享下抛开环境&#xff0c;只对数据仓库测试的一些小心得。 数仓分层设计 标准数仓分为 ODS,DWD…

java计算机毕业设计基于安卓Android的微整形美容app

项目介绍 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设…

前缀和问题

前缀和 一维二维 ac795. 前缀和【一维】 输入一个长度为 nn 的整数序列。 接下来再输入 mm 个询问&#xff0c;每个询问输入一对 l,rl,r。 对于每个询问&#xff0c;输出原序列中从第 ll 个数到第 rr 个数的和。 输入格式 第一行包含两个整数 nn 和 mm。 第二行包含 nn…

基于android的资源文件管理器

软 件 学 院 毕业实训报告 课题名称&#xff1a; android资源管理器 专 业&#xff1a; 软件设计&#xff08;游戏开发方向&#xff09; 班 级&#xff1a; 学 号&#xff1a; 学生姓名&#xff1a; 指导教师&#xff1a; 年 月 日 摘 要 相信大家对Android的发展历史…

Nacos-配置中心,特性,启动,集成mysql,快速入门

Nacos - 配置管理 目录Nacos - 配置管理1. 什么是配置中心1.1 什么是配置1.2 什么是配置中心2 Nacos****简介2.1 主流配置中心对比2.2 Nacos****简介2.3 Nacos****特性3 Nacos 快速入3.1 安装 Nacos Server3.1.1 预备环境准备3.1.2 下载源码或者安装包3.1.3 启动服务器3.1.4 OP…

HTML班级网页设计 基于HTML+CSS+JS制作我们的班级网页(web前端学生网页设计作品)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

计算机毕业设计---java+springboot宠物商城系统

一、项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot Maven mybatis Vue 等等组成&#xff0c;B/…

光栅尺差分计数/频率5MHz/磁栅尺编码器差分脉冲计数采集模块

产品特点&#xff1a; ● 光栅尺磁栅尺解码转换成标准Modbus RTU协议 ● 光栅尺5V差分信号直接输入&#xff0c;4倍频计数 ● 模块可以输出5V的电源给光栅尺供电 ● 高速光栅尺磁栅尺计数&#xff0c;频率可达5MHz ● 支持4个光栅尺同时计数&#xff0c;可识别正反转 ● …