Как скачать файл node js
Перейти к содержимому

Как скачать файл node js

  • автор:

Как скачать файл при помощи nodejs?

Объясните пожалуйста на словах, как скачать файл по ссылке domain.com/package/file.extension ?
Хотя бы на словах.

  • Вопрос задан более трёх лет назад
  • 15518 просмотров

Комментировать

Решения вопроса 1

abaddon65

Например так:

var http = require('http'); var fs = require('fs'); var file = fs.createWriteStream("file.jpg"); var request = http.get("http://test/test.jpg", function(response) < response.pipe(file); >);

Ответ написан более трёх лет назад

Нравится 6 2 комментария

vasIvas @vasIvas Автор вопроса

Спасибо. До ужаса просто, пойду пробовать.

vasIvas @vasIvas Автор вопроса

А Вы мне не подскажите, что нужно делать если файлов качается много?
То что нужно новый get посылать по событию close, это я вроде сообразил,
а вот что с открытым потоком делать я не соображаю. Нужно новый открывать
с новой ссылкой до директории? И нужно ли хандлеры удалять по событию close?

Ответы на вопрос 0

Ваш ответ на вопрос

Войдите, чтобы написать ответ

javascript

  • JavaScript
  • +2 ещё

Почему не запускается gulp?

  • 1 подписчик
  • 9 часов назад
  • 34 просмотра

Как загрузить файл из интернета на Node JS сервер?

Вопрос. Есть ссылка, при переходе на которую сразу начинается скачивание файла
(не нужно никуда нажимать).

Как сделать, чтобы Node.js сам скачивал этот файл и сохранял его в нужную мне папку?
Можете подсказать какой метод за это отвечает.

  • Вопрос задан более года назад
  • 164 просмотра

Комментировать
Решения вопроса 1
onekrugoikov @onekrugoikov

Почитай подробнее про формат Blob.

request('http://music.com/givegonnagiveyouup') .pipe(fs.createWriteStream('givegonnagiveyouup.mp3'))

В данном случае используется библиотека request, так же есть возможность провернуть с помощью fetch:

fetch('http://music.com/givegonnagiveyouup') .then(res => res.buffer()) .then(buffer => fs.writeFileSync('givegonnagiveyouup.mp3', buffer))

Как скачать файл node js

Отправка статических файлов — довольно частая задача в построении и функционировании веб-приложения. Рассмотрим, как отправлять файлы в приложении на Node.js.

Пусть в каталоге проекта у нас будут три файла:

  • app.js
  • about.html
  • index.html

Файл app.js представляет собственно главный файл приложения. В файле index.html определим следующий код:

Главная

Главная

Аналогично определим код в файле about.html :

О сайте

О сайте

Наша задача будет заключаться в том, чтобы отправить их содержимое пользователю.

Первый способ

Для считывания файла может применяться метод fs.createReadStream() , который считывает файл в поток, и затем с помощью метода pipe() мы можем связать считанные файлы с потоком записи, то есть объектом response. Итак, поместим в файл app.js следующий код:

const http = require("http"); const fs = require("fs"); http.createServer(function(request, response)< console.log(`Запрошенный адрес: $`); // получаем путь после слеша const filePath = request.url.substring(1); // смотрим, есть ли такой файл fs.access(filePath, fs.constants.R_OK, err => < // если произошла ошибка - отправляем статусный код 404 if(err)< response.statusCode = 404; response.end("Resourse not found!"); >else < fs.createReadStream(filePath).pipe(response); >>); >).listen(3000, function()< console.log("Server started at 3000"); >);

Вначале мы получаем запрошенный адрес. Допустим, запрошенный адрес будет соответствовать напрямую пути к файлу на сервере. Затем с помощью асинхронной функции fs.access проверяем доступность файла для чтения. Первый параметр функции — путь к файлу. Второй параметр — опция, относительно которой проверяется доступ. В данном случае значение fs.constants.R_OK говорит о том, что мы проверяем права на чтение из файла. Третий параметр функции — функция обратного вызова, которая получает объект ошибки. Если произошла ошибка (файл не досупен для чтения или вовсе не найден), посылаем статусный код 404.

Для отправки файла применяется цепочка методов

fs.createReadStream(filePath).pipe(response);

Метод fs.createReadStream(filePath) создает поток для чтения — объект fs.ReadStream . Для получения данных из потока вызывается метод pipe() , в который передается объект интерфейса stream.Writable или поток для записи. А именно таким и является объект http.ServerResponse, который реализует этот интерфейс.

Запустим приложение и в браузере обратимся по адресу «http://localhost:3000/index.html»:

index.html в Node.js

Аналогично мы можем обратиться по адресу «http://localhost:3000/about.html»:

index.html в Node.js

В даном случае отправляются файлы html, но подобным образом мы можем отправлять самые разные файлы. Например, определим в проекте папку public . И в ней создадим новый файл styles.css со следующим содержимым:

body

Применим эти стили на странице index.html:

Главная

Главная

И затем обратимся к index.html:

Статические файлы в Node.js

Второй способ

Второй способ представляет чтение данных с помощью функции fs.readFile() и отправка с помощью метода response.end() :

const http = require("http"); const fs = require("fs"); http.createServer(function(request, response)< console.log(`Запрошенный адрес: $`); // получаем путь после слеша const filePath = request.url.substring(1); fs.readFile(filePath, function(error, data) < if(error)< response.statusCode = 404; response.end("Resourse not found!"); >else < response.end(data); >>); >).listen(3000, function()< console.log("Server started at 3000"); >);

Результат работы будет аналогичен.

Загрузка файла по 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(`Произошла ошибка: сервер отдал статус $.`); 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(`Произошла ошибка: сервер отдал статус $`); return; > response.pipe(file); >); file.on('finish', () => file.close(() => console.log(`Файл сохранён по адресу: $`))); 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 — это почтальон, который доставляет файлы прямиком вам на руки:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *