Загрузка файла по URL в Node.js без сторонних библиотек

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы скачать файл в Node.js, не привлекая к этому сторонних библиотек, можно воспользоваться встроенными модулями http или https, выбор между которыми зависит от протокола URL-адреса. Скачивание файлов осуществляется через функции http.get() или https.get(), а полученный результат перенаправляется в поток, созданный с помощью fs.createWriteStream. Вот пример кода для скачивания файла по протоколу HTTPS:

JS
Скопировать код
const https = require('https');
const fs = require('fs');

const url = "https://example.com/file.ext";
const filePath = "local_file.ext";

https.get(url, response => {
  const fileStream = fs.createWriteStream(filePath);
  response.pipe(fileStream);
  fileStream.on('finish', () => {
    fileStream.close(); // Не забывайте закрывать ледник! 😄
    console.log('Файл успешно загружен!');
  });
});
Кинга Идем в IT: пошаговый план для смены профессии

Разъяснение кода и лучшие практики

Выбор встроенного модуля Node.js зависит от протокола URL-адреса: для http:// используется модуль http, а для https:// применяется https.

Методы http.get или https.get служат для отправки GET-запроса, результатом которого является поток. Этот поток можно перенаправить в записываемый поток файловой системы с помощью fs.createWriteStream, который эффективно выполняет запись получаемых данных.

JS
Скопировать код
const http = require('http');
const fs = require('fs');

const url = "http://example.com/file.txt";
const savePath = "./local_dir/local_file.txt";

const file = fs.createWriteStream(savePath);
const request = http.get(url, response => {
  response.pipe(file);
  file.on('finish', () => {
    file.close(() => console.log('Файл успешно загружен. Можете начинать чтение.'));
  });
});

Контроль состояния запроса и обработка исключений являются обязательными процедурами. Всегда проверяйте, что запрос выполнен успешно (код 200), и настраивайте обработку ошибок для запроса и файлового потока, чтобы контролировать состояние связи и возможные проблемы файловой системы.

JS
Скопировать код
request.on('response', (response) => {
  if (response.statusCode !== 200) {
    console.error(`Произошла ошибка: сервер отдал статус ${response.statusCode}.`);
    request.abort();
  }
});

file.on('error', (err) => {
  fs.unlink(savePath, () => {});
  throw err;
});

Рекомендации для бесперебойной работы

Чтобы обеспечить надёжность загрузки файла, следует предусмотреть обработку следующих сценариев:

  • Сетевые ошибки, связанные с проблемами соединения;
  • Проблемы с правами доступа к файловой системе — ошибка записи может говорить о нехватке прав доступа;
  • Реакция сервера — при получении ответа с любым статус-кодом, отличающимся от 200, загрузку следует прекратить;
  • Частичная загрузка — удалите недозагруженные части файла, чтобы не допустить порчи данных;
  • Состояние гонки — следите за тем, чтобы другие процессы не создавали конфликтов при обращении к файлу.

Загрузка файлов по пользовательскому вводу

Чтобы обеспечить ввод данных через командную строку или интеграцию процесса загрузки файла в приложение, целесообразно инкапсулировать логику загрузки в отдельную функцию и вызывать её при необходимости.

JS
Скопировать код
const http = require('http');
const fs = require('fs');
const process = require('process');

function downloadFile(url, outputLocationPath) {
  const file = fs.createWriteStream(outputLocationPath);
  http.get(url, (response) => {
    if (response.statusCode !== 200) {
      console.error(`Произошла ошибка: сервер отдал статус ${response.statusCode}`);
      return;
    }
    response.pipe(file);
  });

  file.on('finish', () => file.close(() => console.log(`Файл сохранён по адресу: ${outputLocationPath}`)));
  file.on('error', (err) => {
    fs.unlink(outputLocationPath);
    console.error(err.message);
  });
}

const url = process.argv[2];
const outputPath = process.argv[3];
downloadFile(url, outputPath);

Визуализация

Представим, что Node.js — это почтальон, который доставляет файлы прямиком вам на руки:

Markdown
Скопировать код
Node.js (📮): "У вас посылка!"

Ваш код:
JS
Скопировать код
const http = require('http');
const fs = require('fs');
const file = fs.createWriteStream("file.txt");

http.get("http://example.com/file.txt", response => {
  response.pipe(file);
});
Markdown
Скопировать код
Вы: "Здравствуйте, посылка получена! 📦💌🚚"
Файл: "file.txt"

Посылка была доставлена напрямую, без посредников и сторонних библиотек!

Полезные материалы

  1. Файловая система | Документация Node.js v21.6.1 – Получите больше информации о работе с файлами в Node.js.
  2. HTTP | Документация Node.js v21.6.1 – Обзор встроенных функциональных возможностей для осуществления HTTP-запросов в Node.js.
  3. Buffer | Документация Node.js v15.14.0 – Узнайте о работе с бинарными данными в Node.js.
  4. События | Документация Node.js v21.6.1 – Управляйте событиями в Node.js. Это важно для контроля за потоками.
  5. Node.js — Вступление в Node.js — Отличный обучающий ресурс для создания HTTP-серверов и управления файловыми загрузками в Node.js.