JavaScript

Чтение файла в JavaScript: браузер и Node.js

В JavaScript чтение файла зависит от среды. В браузере нельзя просто взять путь вроде C:\file.txt и прочитать его: пользователь должен выбрать файл через <input type="file">, а код читает содержимое через File API. В Node.js файл можно читать с диска через модуль fs

Это два разных сценария, и их не стоит смешивать

Вариант 1: прочитать файл в браузере

Создайте HTML-файл:

<!doctype html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <title>Чтение файла</title>
</head>
<body>
  <input id="file" type="file" accept=".txt">
  <pre id="output"></pre>

  <script>
    const input = document.querySelector("#file");
    const output = document.querySelector("#output");

    input.addEventListener("change", () => {
      const file = input.files[0];

      if (!file) {
        output.textContent = "Файл не выбран";
        return;
      }

      const reader = new FileReader();

      reader.addEventListener("load", () => {
        output.textContent = reader.result;
      });

      reader.readAsText(file);
    });
  </script>
</body>
</html>

Откройте страницу в браузере, выберите текстовый файл .txt, и его содержимое появится на странице

Что здесь происходит

input.files[0] берет первый выбранный файл:

const file = input.files[0];

FileReader читает содержимое:

const reader = new FileReader();
reader.readAsText(file);

Событие load срабатывает, когда чтение завершилось:

reader.addEventListener("load", () => {
  output.textContent = reader.result;
});

Браузер делает чтение асинхронным, чтобы страница не зависала во время работы с файлом

Вариант 2: прочитать файл в Node.js

Создайте файл text.txt:

Привет из файла

Создайте read.js:

const fs = require("node:fs");

fs.readFile("text.txt", "utf8", (error, data) => {
  if (error) {
    console.error("Не удалось прочитать файл:", error.message);
    return;
  }

  console.log(data);
});

Запустите:

node read.js

Ожидаемый вывод:

Привет из файла

Node.js подходит для скриптов, серверов и утилит, где код имеет доступ к файловой системе

Вариант с async/await в Node.js

Если вы уже знакомы с async и await, можно читать файл через fs/promises:

const fs = require("node:fs/promises");

async function main() {
  try {
    const data = await fs.readFile("text.txt", "utf8");
    console.log(data);
  } catch (error) {
    console.error("Ошибка чтения:", error.message);
  }
}

main();

Этот вариант часто удобнее в реальных скриптах, потому что код читается сверху вниз. Но для первого знакомства callback-пример тоже полезен: он показывает, что чтение файла не происходит мгновенно

Браузер и Node.js: что выбрать

Задача Подход
Пользователь выбирает файл на сайте input type="file" + FileReader
Скрипт читает локальный файл проекта Node.js + fs
Нужно загрузить файл на сервер HTML-форма или fetch с FormData
Нужно прочитать файл по пути на компьютере пользователя браузер так не делает без выбора файла

Частые ошибки

Пытаться читать путь с компьютера в браузере

Такой код не сработает:

fetch("C:/Users/me/file.txt")

Браузер защищает локальные файлы пользователя. Сайт не должен сам читать произвольные файлы с устройства

Забыть, что чтение асинхронное

Результат FileReader доступен после события load, а не сразу после readAsText

Запускать Node.js-код в браузере

require("node:fs") работает в Node.js, но не в обычном браузерном скрипте

Не указывать кодировку

Если в Node.js не указать "utf8", вы можете получить Buffer, а не обычную строку:

fs.readFile("text.txt", (error, data) => {
  console.log(data);
});

Для учебного чтения текста почти всегда пишите:

fs.readFile("text.txt", "utf8", callback);

Мини-задание

Сделайте страницу, которая читает .txt файл и выводит:

  • имя файла;
  • размер файла;
  • первые 100 символов содержимого.

Подсказка:

console.log(file.name);
console.log(file.size);

Что почитать дальше по JavaScript

Если нужен общий маршрут по теме, откройте рубрику JavaScript. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x