Як завантажити файл з Node.js без використання сторонніх бібліотек?
Мені не потрібно нічого особливого. Я лише хочу завантажити файл з заданого URL, а потім зберегти його в заданий каталог.
Ви можете створити HTTP-запит GET
і передати його відповідь
у файловий потік, доступний для запису:
const http = require('http');
const fs = require('fs');
const file = fs.createWriteStream("file.jpg");
const request = http.get("http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg", function(response) {
response.pipe(file);
});
Якщо ви хочете підтримати збір інформації у командному рядку, наприклад, вказати цільовий файл, каталог або URL-адресу, скористайтеся чимось на кшталт Commander.
Як сказала Мішель Тіллі, але з відповідним потоком контролю:
var http = require('http');
var fs = require('fs');
var download = function(url, dest, cb) {
var file = fs.createWriteStream(dest);
var request = http.get(url, function(response) {
response.pipe(file);
file.on('finish', function() {
file.close(cb);
});
});
}
Не дочекавшись події finish
, наївні скрипти можуть закінчити роботу з неповним файлом.
Редагування: Дякуємо @Augusto Roman за вказівку на те, що cb
слід передавати до file.close
, а не викликати явно.
Відповідь gfxmonk має дуже тісну гонку даних між зворотним викликом і завершенням file.close()
. file.close()
насправді приймає зворотній виклик, який викликається після завершення закриття. В іншому випадку негайне використання файлу може завершитися невдачею (дуже рідко!).
Повноцінне рішення полягає в наступному:
var http = require('http');
var fs = require('fs');
var download = function(url, dest, cb) {
var file = fs.createWriteStream(dest);
var request = http.get(url, function(response) {
response.pipe(file);
file.on('finish', function() {
file.close(cb); // close() is async, call cb after close completes.
});
});
}
Не дочекавшись події завершення, наївні скрипти можуть закінчити роботу з незавершеним файлом. Не запланувавши зворотний виклик cb
через close, ви можете отримати перегони між доступом до файлу та фактичною готовністю файлу.