马黑黑 发表于 2026-4-7 14:30

JS:打开本地文本文件

<style>
        .artBox { font-size: 20px; margin: 30px auto; max-width: 1200px; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; color: #333; }
        .artBox h2 { color: #1a73e8; border-bottom: 2px solid #eee; padding-bottom: 8px; margin-bottom: 20px; }
        .artBox > p { margin: 10px 0; line-height: 1.8; text-align: justify; }
        .artBox blockquote { background: #f9f9f9; border-left: 4px solid #1a73e8; padding: 15px 20px; margin: 20px 0; color: #555; }
        .artBox code { background: #eee; padding: 2px 6px; border-radius: 3px; font-family: 'Consolas', 'Monaco', monospace; font-size: 0.95em; }
        .artBox .mid { text-align: center; }
        .artBox .right { text-align: right; }
</style>

<div class="artBox">
        <p>出于安全考虑,JS被设置成没有直接读取本地文件的权限,除非用户允许。</p>
        <blockquote cite="https://developer.mozilla.org/zh-CN/docs/Web/API/File_API/Using_files_from_web_applications">
                <p>通过使用文件 API,web 内容可以要求用户选择本地文件,然后读取这些文件的内容。这种选择可以通过使用 HTML &lt;input type="file"&gt; 元素或通过拖放来完成。</p>
                <p class="right">—— MDN</p>
        </blockquote>
        <p>用户在 <code>&lt;input type="file"&gt;</code> 元素中选择的文件或使用拖放方式拖曳到指定接收器的文件,被视为允许打开,此后,JS的文件 API 就可以对文件进行一系列读取操作。<code>FileReader</code> 是一个文件API接口,它允许 Web 应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。</p>
        <p>以下是实例演示。脚本规定了两种文件格式,如果在打开文件时选择“所有文件”可以突破格式限制,但脚本内部只处理文本类型格式的文件):</p>
        <div class="codebox" data-prev="1">
&lt;style&gt;
    .pa { margin: 20px auto; width: 1000px; }
    .pa textarea { width: 100%; height: 100%; height: 560px; padding: 12px; resize: none; font-size: 16px;}
    .pa h1 { text-align: center; }
&lt;/style&gt;

&lt;div class="pa"&gt;
    &lt;h1&gt;打开本地文本文件演示&lt;/h1&gt;
    &lt;!-- accept属性规定可打开的文件类型 --&gt;
    &lt;p&gt;&lt;input id="fileOpen" type="file" accept=".txt, .html"&gt;&lt;/input&gt;&lt;/p&gt;
    &lt;p&gt;&lt;textarea id="txtArea"&gt;&lt;/textarea&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;script&gt;
    function openFile(event) {
      // event 参数将由浏览器事件管理系统自动注入,下行是检验
      // console.log(event.type, event); // → change, Event
      const file = event.target.files;

      // 如果没有选择文件或文件类型不符合则放弃执行后面的语句
      if (!file && !file.type.startsWith('text')) return;

      const reader = new FileReader(); // 实例化FileReader对象为reader
      // reader加载完成后
      reader.onload = () =&gt; {
            txtArea.value = reader.result; // 显示读取结果
      };

      // 若reader加载出错
      reader.onerror = () =&gt; {
            txtArea.value = '读取文件时出错'; // 显示错误信息
      };

      // 关键 :使用readASText方法读取文件的文本内容
      reader.readAsText(file);
    }
   
    fileOpen.onchange = openFile; // 选择文件后调用openFile(event)函数
&lt;/script&gt;
        </div>
        <p>看起来也不特别复杂,核心在于:用户授权(选择了文件)、使用 FileReader API处理文件,最后将处理结果输出。当然,任何API都有自己的规范和方法,需要逐一熟悉方可将其应用于实际场景中。</p>
        <p>另外,从 <code>&lt;input type="file"&gt;</code> 元素获得的文件列表页富含很多有用信息,这些信息以对象的形式存储,里面包含文件名、文件类型、文件大小、最后修改时间等等,文件内容则如上述示例那样需要 <code>FileReader</code> API 读取。</p>
</div>

<script type="module">
   function loadLineNumFile() {
       const script = document.createElement('script');
       script.charset = 'utf-8';
       script.src = 'https://638183.freep.cn/638183/web/helight/linenumber-2026.js';
       script.defer = true;
       script.onload = () => addLineNumber();
       document.head.appendChild(script);
   }

   loadLineNumFile();
</script>

山人 发表于 2026-4-7 14:32

{:4_191:}

杨帆 发表于 2026-4-7 15:24

挺好,这个可以直接查看、编辑.html~谢谢马老师精彩分享{:4_190:}

马黑黑 发表于 2026-4-7 19:58

杨帆 发表于 2026-4-7 15:24
挺好,这个可以直接查看、编辑.html~谢谢马老师精彩分享

这个主要还是演示打开本地文件(本例主要处理文本类型格式的文档)。

要想做出可打开、编辑、保存的功能,需要更为复杂而且复杂到不知多少倍的实现机制。最经典的实现案例是 Only Office,它的网页版可以编写 office 套件所能做到的一切。

JS还有一系列的与操作系统接洽的API,统称为文件系统API,通过它们可以做一切事情(前提是基于指定的安全机制,比如 https 协议,同时还需要浏览器的支持——这个也是微软放弃IE的主因之一,IE由于走了极端的发展道路且渐行渐远已经无法和国际标准看齐,尽管它在发展历程中有很多不可忽视的贡献)。

红影 发表于 2026-4-7 20:14

马黑黑 发表于 2026-4-7 19:58
这个主要还是演示打开本地文件(本例主要处理文本类型格式的文档)。

要想做出可打开、编辑、保存的功 ...

(本例主要处理文本类型格式的文档)
怪不得打不开word文件。

马黑黑 发表于 2026-4-7 20:36

红影 发表于 2026-4-7 20:14
(本例主要处理文本类型格式的文档)
怪不得打不开word文件。

Word文档的 type 类型是极度复杂的富文本文档,协议和 text 不一样,打开它需要复杂千万倍的机制。

杨帆 发表于 2026-4-7 23:09

马黑黑 发表于 2026-4-7 19:58
这个主要还是演示打开本地文件(本例主要处理文本类型格式的文档)。

要想做出可打开、编辑、保存的功 ...

长知识了~谢谢马老师{:4_190:}

马黑黑 发表于 2026-4-8 12:48

杨帆 发表于 2026-4-7 23:09
长知识了~谢谢马老师

{:4_191:}

红影 发表于 2026-4-9 22:04

马黑黑 发表于 2026-4-7 20:36
Word文档的 type 类型是极度复杂的富文本文档,协议和 text 不一样,打开它需要复杂千万倍的机制。

哦哦,那还是别用它打开的好,太费力的不划算。

马黑黑 发表于 2026-4-9 22:25

红影 发表于 2026-4-9 22:04
哦哦,那还是别用它打开的好,太费力的不划算。

不过有人做了一个叫 Only Office 的东东,可以安装,也可以只通过浏览器使用

红影 发表于 2026-4-11 16:55

马黑黑 发表于 2026-4-9 22:25
不过有人做了一个叫 Only Office 的东东,可以安装,也可以只通过浏览器使用

自己电脑里一般都有 Office 的,为什么还要安装这个呢?

马黑黑 发表于 2026-4-11 17:37

红影 发表于 2026-4-11 16:55
自己电脑里一般都有 Office 的,为什么还要安装这个呢?

那不见得电脑都有 office 软件。

微软的office软件一套少则近1000元,多则好几千甚至上万,一般都不会安装,除非是刚需。我的电脑家用的有六台,没有一台安装微软office,也不装WPS,其中几台安装有永中office和Only Office,公司的安装开源的LibreOffice

红影 发表于 2026-4-11 20:35

马黑黑 发表于 2026-4-11 17:37
那不见得电脑都有 office 软件。

微软的office软件一套少则近1000元,多则好几千甚至上万,一般都不会 ...

那是我弄错了?我咋觉得每调电脑都本来就有office软件,还以为都是随电脑带的呢。

马黑黑 发表于 2026-4-11 21:48

红影 发表于 2026-4-11 20:35
那是我弄错了?我咋觉得每调电脑都本来就有office软件,还以为都是随电脑带的呢。
你说的可能是盗版软件。盗版软件是不用花钱的。由于特殊环境,我们使用盗版软件还浑然不知,但是,像MS Office这一类软件,其实人家老贵了。

顺便说一下,没有免费的 MS Office,如果你没有在上面花钱就能用,肯定用的是盗版的。

红影 发表于 2026-4-12 12:42

马黑黑 发表于 2026-4-11 21:48
你说的可能是盗版软件。盗版软件是不用花钱的。由于特殊环境,我们使用盗版软件还浑然不知,但是,像MS O ...

哦,有着可能,我都没花钱还不知的呢{:4_173:}

马黑黑 发表于 2026-4-12 12:46

红影 发表于 2026-4-12 12:42
哦,有着可能,我都没花钱还不知的呢

像你这样的高知,按理不应该和街道委员会阿姨一个样的认识

红影 发表于 2026-4-12 13:58

马黑黑 发表于 2026-4-12 12:46
像你这样的高知,按理不应该和街道委员会阿姨一个样的认识

那要分领域的,在某些领域我甚至不如街道阿姨,比如做饭,甚至代码{:4_173:}

马黑黑 发表于 2026-4-12 20:01

红影 发表于 2026-4-12 13:58
那要分领域的,在某些领域我甚至不如街道阿姨,比如做饭,甚至代码

这说法俺得消化消化

红影 发表于 2026-4-12 22:59

马黑黑 发表于 2026-4-12 20:01
这说法俺得消化消化

这有什么消化的,这是事实啊。

马黑黑 发表于 2026-4-12 23:10

红影 发表于 2026-4-12 22:59
这有什么消化的,这是事实啊。

理解不了
页: [1] 2
查看完整版本: JS:打开本地文本文件