Comment télécharger un fichier avec Node.js sans utiliser de bibliothèques tierces ?
Je n'ai besoin de rien de spécial. Je veux seulement télécharger un fichier à partir d'une URL donnée, puis l'enregistrer dans un répertoire donné.
Vous pouvez créer une requête HTTP GET
et envoyer sa réponse dans un flux de fichiers inscriptibles :
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);
});
Si vous souhaitez prendre en charge la collecte d'informations en ligne de commande - comme la spécification d'un fichier ou d'un répertoire cible, ou d'une URL - consultez quelque chose comme Commander.
Comme l'a dit Michelle Tilley, mais avec le flux de contrôle approprié :
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);
});
});
}
Sans attendre l'événement finish
, les scripts naïfs peuvent se retrouver avec un fichier incomplet.
Edit: Merci à @Augusto Roman d'avoir signalé que cb
devrait être passé à file.close
, et non appelé explicitement.
La réponse de gfxmonk a une course aux données très serrée entre le callback et la fin de file.close()
. file.close()
prend en fait un callback qui est appelé lorsque la fermeture est terminée. Sinon, les utilisations immédiates du fichier peuvent échouer (très rarement !).
Une solution complète est :
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.
});
});
}
Sans attendre l'événement finish, les scripts naïfs peuvent se retrouver avec un fichier incomplet. Sans planifier le callback cb
via close, vous pouvez avoir une course entre l'accès au fichier et le fait que le fichier soit réellement prêt.