Загрузка файла по URL в Node.js без сторонних библиотек
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы скачать файл в Node.js, не привлекая к этому сторонних библиотек, можно воспользоваться встроенными модулями http
или https
, выбор между которыми зависит от протокола URL-адреса. Скачивание файлов осуществляется через функции http.get()
или https.get()
, а полученный результат перенаправляется в поток, созданный с помощью fs.createWriteStream
. Вот пример кода для скачивания файла по протоколу HTTPS:
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('Файл успешно загружен!');
});
});
Разъяснение кода и лучшие практики
Выбор встроенного модуля Node.js зависит от протокола URL-адреса: для http://
используется модуль http
, а для https://
применяется https
.
Методы http.get
или https.get
служат для отправки GET-запроса, результатом которого является поток. Этот поток можно перенаправить в записываемый поток файловой системы с помощью fs.createWriteStream
, который эффективно выполняет запись получаемых данных.
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), и настраивайте обработку ошибок для запроса и файлового потока, чтобы контролировать состояние связи и возможные проблемы файловой системы.
request.on('response', (response) => {
if (response.statusCode !== 200) {
console.error(`Произошла ошибка: сервер отдал статус ${response.statusCode}.`);
request.abort();
}
});
file.on('error', (err) => {
fs.unlink(savePath, () => {});
throw err;
});
Рекомендации для бесперебойной работы
Чтобы обеспечить надёжность загрузки файла, следует предусмотреть обработку следующих сценариев:
- Сетевые ошибки, связанные с проблемами соединения;
- Проблемы с правами доступа к файловой системе — ошибка записи может говорить о нехватке прав доступа;
- Реакция сервера — при получении ответа с любым статус-кодом, отличающимся от 200, загрузку следует прекратить;
- Частичная загрузка — удалите недозагруженные части файла, чтобы не допустить порчи данных;
- Состояние гонки — следите за тем, чтобы другие процессы не создавали конфликтов при обращении к файлу.
Загрузка файлов по пользовательскому вводу
Чтобы обеспечить ввод данных через командную строку или интеграцию процесса загрузки файла в приложение, целесообразно инкапсулировать логику загрузки в отдельную функцию и вызывать её при необходимости.
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 — это почтальон, который доставляет файлы прямиком вам на руки:
Node.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);
});
Вы: "Здравствуйте, посылка получена! 📦💌🚚"
Файл: "file.txt"
Посылка была доставлена напрямую, без посредников и сторонних библиотек!
Полезные материалы
- Файловая система | Документация Node.js v21.6.1 – Получите больше информации о работе с файлами в Node.js.
- HTTP | Документация Node.js v21.6.1 – Обзор встроенных функциональных возможностей для осуществления HTTP-запросов в Node.js.
- Buffer | Документация Node.js v15.14.0 – Узнайте о работе с бинарными данными в Node.js.
- События | Документация Node.js v21.6.1 – Управляйте событиями в Node.js. Это важно для контроля за потоками.
- Node.js — Вступление в Node.js — Отличный обучающий ресурс для создания HTTP-серверов и управления файловыми загрузками в Node.js.