js实现前端HTML操作用户文件的读写(已封装)

2023-11-04

 readFile

第一个方法是 readFile,用于读取文件内容并以 Promise 对象的形式返回。它接受一个 File 对象和一个可选的编码格式参数,使用 FileReader 对象读取文件内容,当读取完成时调用 resolve 方法返回文件内容,出错时调用 reject 方法返回错误信息。

/**
 * 读取文件的方法,返回Promise对象
 * @param file 要读取的文件对象
 * @param encoding 文件编码格式,默认为'utf-8'
 */
function readFile(file: File, encoding = 'utf-8'): Promise<string> {
  return new Promise((resolve, reject) => {
    // 创建FileReader对象
    const reader = new FileReader();
    // 当文件读取完成后,调用resolve方法返回文件内容
    reader.onload = function () {
      resolve(reader.result as string);
    };
    // 当文件读取出错时,调用reject方法返回错误信息
    reader.onerror = function () {
      reject(reader.error);
    };
    // 以指定的编码格式读取文件内容
    reader.readAsText(file, encoding);
  });
}

writeFile

第二个方法是 writeFile,用于将内容写入文件并以 Promise 对象的形式返回。它接受一个要写入的文件名和文件内容,使用 Blob 和 URL 对象创建一个下载链接,模拟点击下载链接下载文件,等待下载完成后删除下载链接和 URL 对象,并调用 resolve 方法。


/**
 * 写入文件的方法,返回Promise对象
 * @param filename 要写入的文件名
 * @param content 要写入的文件内容
 */
function writeFile(filename: string, content: string): Promise<void> {
  return new Promise((resolve, reject) => {
    // 创建Blob对象
    const blob = new Blob([content], { type: 'text/plain' });
    // 创建URL对象
    const url = URL.createObjectURL(blob);
    // 创建a标签
    const a = document.createElement('a');
    a.href = url;
    a.download = filename;
    document.body.appendChild(a);
    // 模拟点击a标签下载文件
    a.click();
    // 等待下载完成后,删除a标签和URL对象,调用resolve方法
    setTimeout(() => {
      document.body.removeChild(a);
      URL.revokeObjectURL(url);
      resolve();
    }, 0);
  });
}

实现读写

第三个方法是 readAndWriteFile,使用 async/await 语法读取文件和写入文件。它接受一个要读取的文件对象和一个要写入的文件名对象,调用 readFile 方法读取文件内容,处理文件内容后调用 writeFile 方法写入文件。

事件监听器监听文件选择器的 change 事件,获取选择的文件并调用 readAndWriteFile 方法读取和写入文件。当文件读写成功或出错时分别输出相应的信息。


/**
 * 使用async/await语法读取文件和写入文件
 * @param inputFile 要读取的文件对象
 * @param outputFile 要写入的文件名
 */
async function readAndWriteFile(inputFile: File, outputFile: { name: string }): Promise<void> {
  try {
    // 读取文件
    const fileContent = await readFile(inputFile, 'utf-8');
    // 处理文件内容
    const newContent = fileContent.replace(/foo/g, 'bar');
    // 写入文件
    await writeFile(outputFile.name, newContent);
    console.log('文件写入成功');
  } catch (error) {
    console.error('文件读写出错', error);
  }
}

// 在文件选择时调用readAndWriteFile方法
const inputFile = document.querySelector('input[type="file"]') as HTMLInputElement;
inputFile.addEventListener('change', (event) => {
  // 获取选择的文件
  const file = (event.target as HTMLInputElement)?.files?.[0];
  if (file) {
    // 调用readAndWriteFile方法读取文件和写入文件
    readAndWriteFile(file, { name: 'output.txt' }).then(() => {
      console.log('文件写入成功并下载');
    }).catch((error) => {
      console.error('文件读写出错', error);
    });
  }
});

完整代码

/**
 * 读取文件的方法,返回Promise对象
 * @param file 要读取的文件对象
 * @param encoding 文件编码格式,默认为'utf-8'
 */
function readFile(file: File, encoding = 'utf-8'): Promise<string> {
  return new Promise((resolve, reject) => {
    // 创建FileReader对象
    const reader = new FileReader();
    // 当文件读取完成后,调用resolve方法返回文件内容
    reader.onload = function () {
      resolve(reader.result as string);
    };
    // 当文件读取出错时,调用reject方法返回错误信息
    reader.onerror = function () {
      reject(reader.error);
    };
    // 以指定的编码格式读取文件内容
    reader.readAsText(file, encoding);
  });
}

/**
 * 写入文件的方法,返回Promise对象
 * @param filename 要写入的文件名
 * @param content 要写入的文件内容
 */
function writeFile(filename: string, content: string): Promise<void> {
  return new Promise((resolve, reject) => {
    // 创建Blob对象
    const blob = new Blob([content], { type: 'text/plain' });
    // 创建URL对象
    const url = URL.createObjectURL(blob);
    // 创建a标签
    const a = document.createElement('a');
    a.href = url;
    a.download = filename;
    document.body.appendChild(a);
    // 模拟点击a标签下载文件
    a.click();
    // 等待下载完成后,删除a标签和URL对象,调用resolve方法
    setTimeout(() => {
      document.body.removeChild(a);
      URL.revokeObjectURL(url);
      resolve();
    }, 0);
  });
}

/**
 * 使用async/await语法读取文件和写入文件
 * @param inputFile 要读取的文件对象
 * @param outputFile 要写入的文件名
 */
async function readAndWriteFile(inputFile: File, outputFile: { name: string }): Promise<void> {
  try {
    // 读取文件
    const fileContent = await readFile(inputFile, 'utf-8');
    // 处理文件内容
    const newContent = fileContent.replace(/foo/g, 'bar');
    // 写入文件
    await writeFile(outputFile.name, newContent);
    console.log('文件写入成功');
  } catch (error) {
    console.error('文件读写出错', error);
  }
}

// 在文件选择时调用readAndWriteFile方法
const inputFile = document.querySelector('input[type="file"]') as HTMLInputElement;
inputFile.addEventListener('change', (event) => {
  // 获取选择的文件
  const file = (event.target as HTMLInputElement)?.files?.[0];
  if (file) {
    // 调用readAndWriteFile方法读取文件和写入文件
    readAndWriteFile(file, { name: 'output.txt' }).then(() => {
      console.log('文件写入成功并下载');
    }).catch((error) => {
      console.error('文件读写出错', error);
    });
  }
});

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js实现前端HTML操作用户文件的读写(已封装) 的相关文章

  • 如何抑制窗口鼠标滚轮滚动...?

    我正在开发嵌入页面中的画布应用程序 我有它 因此您可以使用鼠标滚轮放大绘图 但不幸的是 这会滚动页面 因为它是文章的一部分 当我在 dom 元素上滚动鼠标滚轮时 是否可以阻止鼠标滚轮在窗口上滚动 附加鼠标滚轮 不是 Gecko DOMMou
  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • 如何将 Google Charts 与 Vue.js 库一起使用?

    我正在尝试使用 Vue js 库使用 Google Charts 制作图表 但我不知道如何添加到 div 这是我尝试做的 这是如何使用普通 javascript 添加图表 这是文档的代码示例 https developers google
  • Jquery/Javascript 上传和下载文件,无需后端

    是否可以在没有后端服务器的情况下在 JavaScript 函数中下载和上传文件 我需要导出和导入由 JavaScript 函数生成的 XML 我想创建按钮 保存 xml 来保存文件 但我不知道是否可行 另一方面 我希望将 XML 文件直接上
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • jquery从变量中删除html元素

    我将 html 保存在变量中 var itinerary events today html 我有很多 html 和一个按钮我想删除 它的 ID 为 myButton 如何从变量中保存的 html 中删除它 我建议这种方法 var itin
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • HTML 中部分着色的阿拉伯语单词

    我不会说阿拉伯语 但我需要我们网站上对阿拉伯语的具体支持 我需要将部分阿拉伯语单词放在 span 与单词其他部分的风格不同 当我输入两个字符时 and 它们被组合成word 但是当我使用 HTML 标记时 span span 这些字母在输出
  • 提交表单并重定向页面

    我在 SO 上看到了很多与此相关的其他问题 但没有一个对我有用 我正在尝试提交POST表单 然后将用户重定向到另一个页面 但我无法同时实现这两种情况 我可以获取重定向或帖子 但不能同时获取两者 这是我现在所拥有的
  • 如何阻止破折号自行包裹?

    我有一个标题 标题最后一个单词的末尾是一个破折号 单词和破折号之间没有空格 当浏览器窗口变小时 破折号会中断并换成新行 在自己的行上有一个破折号是不好的排版 如何停止破折号之前的换行 以便最后一个单词运行到新行 这是代码 h1 XYZ co
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 模块构建失败(来自 ./node_modules/babel-loader/lib/index.js)Vue Js

    我从 GitHub 下载了一个我和我的朋友正在开发的项目 但是当我尝试运行时 npm run serve 我收到这个错误 src main js 中的错误 Module build failed from node modules babe
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • 如何更改此 jquery 插件的时区/时间戳?

    我正在使用这个名为 timeago 的插件 在这里找到 timeago yarp com 它工作得很好 只是它在似乎不同的时区运行 我住在美国东部 费城时区 当我将准确的 EST 时间放入 timeago 插件时 比如 2011 05 28
  • 如何在jquery中以相反的顺序迭代元素? [复制]

    这个问题在这里已经有答案了 我是jquery的新手 我想知道如何使用each 在jquery中以相反的顺序迭代表单元素 任何帮助 将不胜感激 尝试这个 input get reverse each function
  • JQuery 图像上传不适用于未来的活动

    我希望我的用户可以通过帖子上传图像 因此 每个回复表单都有一个上传表单 用户可以通过单击上传按钮上传图像 然后单击提交来提交帖子 现在我的上传表单可以上传第一个回复的图像 但第二个回复的上传不起作用 我的提交过程 Ajax 在 php 提交
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成

随机推荐

  • JavaWeb核心技术——Request请求

    目录 1 Request和Response的概述 2 Request对象 2 1 Request继承体系 2 2 Request获取请求数据 2 2 1 获取请求行数据 2 2 2 获取请求头数据 2 2 3 获取请求体数据 2 2 4 获
  • educoderpython答案顺序结构程序设计_程序设计基础

    程序设计基础 一 程序设计方法与风格 1 设计方法 指设计 编制 调试程序的方法和过程 主要有结构化程序设计方法 软件工程方法和面向对象方法 2 设计风格 良好的程序设计风格 主要应注重和考虑下述一些因素 符号名的命名应具有一定的实际含义
  • navicat连接mysql1064_navicat for mysql出现1064错误怎么办

    navicat for mysql出现1064错误怎么办 存储过程 参数 代码 分隔符 长度 navicat for mysql出现1064错误怎么办 易采站长站 站长之家为您整理了navicat for mysql出现1064错误怎么办的
  • 【pandas】空数据处理

    目录 1 判断空值 isna 2 空值删除 dropna 3 空值替换 dropna 数据清洗是对一些没有用的数据进行处理的过程 很多数据集存在数据缺失 数据格式错误 错误数据或重复数据的情况 如果要使数据分析更加准确 就需要对这些没有用的
  • 机器学习策略二——优化深度学习系统

    进行误差分析 Carrying out error analysis 如果你希望让学习算法能够胜任人类能做的任务 但你的学习算法还没有达到人类的表现 那么人工检查一下你的算法犯的错误也许可以让你了解接下来应该做什么 这个过程称为错误分析 假
  • C++如何做字符串分割(5种方法)

    1 用strtok函数进行字符串分割 原型 char strtok char str const char delim 功能 分解字符串为一组字符串 参数说明 str为要分解的字符串 delim为分隔符字符串 返回值 从str开头开始的一个
  • 卷积神经网络(CNN)详解与代码实现

    1 应用场景 卷积神经网络的应用不可谓不广泛 主要有两大类 数据预测和图片处理 数据预测自然不需要多说 图片处理主要包含有图像分类 检测 识别 以及分割方面的应用 图像分类 场景分类 目标分类 图像检测 显著性检测 物体检测 语义检测等等
  • 关于二阶锥优化(SOCP)的学习

    原来 数学不好的时候 真的很难深入下去做研究 最近的两个月时间里 我就边学习SOCP相关的理论知识 一边拿它当工具来分析多视角几何中的问题 包括Triangulation Homography Estimation等 接触到SOCP的起因在
  • Linux脚本启动jar包

    注意 以下脚本笔者是在Windows上编辑的 因此默认格式是dos 如果在Linux上使用 请使用vi命令编该文件 改为Unix格式 笔者使用的SpringBoot jsp 因此使用的是war包 如果你使用的是jar包 在文中用到war的地
  • 【notepad++】中删除中文字符

    一 龥
  • html中图片自动循环滚动代码,实现长图片自动循环滚动效果

    实现思路 滚动效果用实现 有个方法 可以滚动到指定位置 有滚动效果 不是直接到指定位置 不了解的看这里种定位滚动方式演示 每一个Item是一张长图 这样首尾相接滚动起来 滚到无限远 就是无限循环的效果 然后再改变滚动的速度 就可以了 sav
  • SVM实现MNIST手写数字识别的实验

    本文是对手写数字识别 二 SVM 实现Mnist image 手写数字图像识别 Sanger1990的博客 CSDN博客 mnist svm 文章中程序的小修改 使代码正常完成预定工作 原代码不能正常完成运行 from PIL import
  • 如何移植和使用QJson?

    一 QJson库的下载 下载链接 http qjson sourceforge net build 二 使用Qt4 8 Mingw编译QJson 1 解压QJson master压缩包 新建一个QJson目录 将QJson master中的
  • 北大AI公开课2019

    2019年2月20日 北京大学 人工智能前沿与产业趋势 正式开课 本学期的课程邀请到了商汤科技副总裁沈徽 驭势科技CEO吴甘沙 微软亚洲研究院副院长周明 360人工智能研究院院长颜水成 YC中国创始人及CEO 百度集团副董事长陆奇等14位来
  • RGMII接口延时问题分析

    问题1 为什么RGMII时钟线和数据线要做延时处理 由于RGMII的数据传输是根据时钟信号采样获得的 RGMII时钟在1000Mb s速率下在上升沿和下降沿均进行采样 在100Mb s速率及10Mb s速率下 仅在上升沿采样数据位 这就会出
  • IEC60601-1-2并列标准:电磁兼容第四版(2014 ed4.0/2020ed 4.1 )对比第三版2007更新内容VS新YY9706.102-2021ed3和旧YY0505-2012ed2.1

    目录 旧版YY 0505 2012 IEC60601 1 2 2004 ed2 1 与新版YY 9706 102 2021 IEC60601 1 2 2007 ed3 IEC 60601 1 2版本迭代 IEC 60601 1 2 2007
  • X-Frame-Options(点击劫持)

    漏洞描述 点击劫持 ClickJacking 是一种视觉上的欺骗手段 攻击者使用一个透明的iframe 覆盖在一个网页上 然后诱使用户在网页上进行操作 此时用户将在不知情的情况下点击透明的iframe页面 通过调整iframe页面的位置 可
  • 计算机层次结构的四个纬度,2014年计算机一级考试MS Office第四章考点解析(12)

    4 5 图标 4 5 1图表的基本概念 1 图表类型 Excel提供了标准图表类型 每一种图表类型又分为多个子类型 可以根据需要选择不同的 图表类型表现数据 常用的图表类型有 柱形图 条形图 饼图 面积图 XY散点图 圆 环图 股价图 曲面
  • 让VBS脚本也有GUI图形界面

    set ie wscript createobject internetexplorer application event 创建ie对象 ie menubar 0 取消菜单栏 ie addressbar 0 取消地址栏 ie toolba
  • js实现前端HTML操作用户文件的读写(已封装)

    readFile 第一个方法是 readFile 用于读取文件内容并以 Promise 对象的形式返回 它接受一个 File 对象和一个可选的编码格式参数 使用 FileReader 对象读取文件内容 当读取完成时调用 resolve 方法