Wie lade ich eine Datei mit Node.js herunter, ohne Bibliotheken von Drittanbietern zu verwenden ?
Ich brauche nichts Besonderes. Ich möchte nur eine Datei von einer bestimmten URL herunterladen und sie dann in einem bestimmten Verzeichnis speichern.
Antworten:
Sie können eine HTTP-
GET
Anforderung erstellen undresponse
in einen beschreibbaren Dateistream weiterleiten:Wenn Sie das Sammeln von Informationen in der Befehlszeile unterstützen möchten, z. B. das Angeben einer Zieldatei, eines Zieldverzeichnisses oder einer URL, lesen Sie etwas wie Commander .
quelle
node.js:201 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: connect ECONNREFUSED at errnoException (net.js:646:11) at Object.afterConnect [as oncomplete] (net.js:637:18)
.http.get
Zeile zu verwenden. vielleichthttp://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg
(und ersetzenfile.png
durchfile.jpg
).https
müssen,https
andernfalls wird ein Fehler ausgegeben.Vergessen Sie nicht, mit Fehlern umzugehen! Der folgende Code basiert auf der Antwort von Augusto Roman.
quelle
download()
selbst in derpipe
Lage?Wie Michelle Tilley sagte, aber mit dem entsprechenden Kontrollfluss:
Ohne auf das
finish
Ereignis zu warten , können naive Skripte eine unvollständige Datei enthalten.Bearbeiten: Vielen Dank an @Augusto Roman für den Hinweis, dass an übergeben werden
cb
solltefile.close
, nicht explizit aufgerufen.quelle
download()
, wie würde ich das tun? Was würde ich alscb
Argument angeben? Ich habe diedownload('someURI', '/some/destination', cb)
aber nicht verstanden, was ich in die cb setzen sollApropos Fehlerbehandlung: Es ist sogar noch besser, Anforderungsfehler zu hören. Ich würde sogar validieren, indem ich den Antwortcode überprüfe. Hier wird es nur für 200 Antwortcodes als Erfolg angesehen, aber andere Codes könnten gut sein.
Trotz der relativen Einfachheit dieses Codes würde ich empfehlen, das Anforderungsmodul zu verwenden, da es viel mehr Protokolle (Hallo HTTPS!) Verarbeitet, die von Haus aus nicht unterstützt werden
http
.Das würde so gemacht werden:
quelle
response.statusCode !== 200
das cb onfinish
niemals aufgerufen wird.Die Antwort von gfxmonk hat ein sehr enges Datenrennen zwischen dem Rückruf und dem
file.close()
Abschluss.file.close()
Nimmt tatsächlich einen Rückruf entgegen, der aufgerufen wird, wenn der Abschluss abgeschlossen ist. Andernfalls kann die sofortige Verwendung der Datei fehlschlagen (sehr selten!).Eine vollständige Lösung ist:
Ohne auf das Endereignis zu warten, können naive Skripte eine unvollständige Datei enthalten. Ohne den
cb
Rückruf über das Schließen zu planen , kann es zu einem Wettlauf zwischen dem Zugriff auf die Datei und der tatsächlichen Bereitschaft der Datei kommen.quelle
var request =
entfernt wird?Möglicherweise hat sich node.js geändert, aber es scheint, dass es einige Probleme mit den anderen Lösungen gibt (unter Verwendung von Node v8.1.2):
file.close()
diefinish
Veranstaltung nicht anrufen . Standardmäßigfs.createWriteStream
ist der Wert auf autoClose eingestellt: https://nodejs.org/api/fs.html#fs_fs_createwritestream_path_optionsfile.close()
sollte bei Fehler aufgerufen werden. Möglicherweise wird dies nicht benötigt, wenn die Datei gelöscht wird (unlink()
), aber normalerweise ist dies: https://nodejs.org/api/stream.html#stream_readable_pipe_destination_optionsstatusCode !== 200
fs.unlink()
ohne Rückruf ist veraltet (Ausgabe Warnung)dest
Datei vorhanden ist; es wird überschriebenIm Folgenden finden Sie eine modifizierte Lösung (mit ES6 und Versprechungen), mit der diese Probleme behoben werden können.
quelle
const https = require("https");
fürconst http = require("http");
Lösung mit Zeitüberschreitung, Speicherverlust verhindern:
Der folgende Code basiert auf der Antwort von Brandon Tilley:
Erstellen Sie keine Datei, wenn Sie eine Fehlermeldung erhalten, und verwenden Sie lieber das Zeitlimit, um Ihre Anforderung nach X Sekunden zu schließen.
quelle
http.get("http://example.com/yourfile.html",function(){})
http.get
. Der Speicherverlust tritt nur auf, wenn das Herunterladen der Datei zu lange dauert.Für diejenigen, die auf der Suche nach einem Versprechen im Es6-Stil waren, wäre es wahrscheinlich so etwas wie:
quelle
responseSet
flag verursachte aus irgendeinem Grund, für den ich keine Zeit gehabt hatte, meine Datei unvollständig herunterzuladen. Es sind keine Fehler aufgetreten, aber die von mir aufgefüllte TXT-Datei enthielt die Hälfte der Zeilen, die vorhanden sein mussten. Durch Entfernen der Logik für das Flag wurde das Problem behoben. Ich wollte nur darauf hinweisen, wenn jemand Probleme mit dem Ansatz hatte. Noch +1Der Code von Vince Yuan ist großartig, aber es scheint etwas falsch zu sein.
quelle
Ich bevorzuge request (), da Sie damit sowohl http als auch https verwenden können.
quelle
"As of Feb 11th 2020, request is fully deprecated. No new changes are expected to land. In fact, none have landed for some time."
quelle
Hallo , Ich denke, Sie können das Modul child_process und den Befehl curl verwenden.
Wenn Sie große Dateien herunterladen möchten, können Sie außerdem das Cluster- Modul verwenden, um mehr CPU-Kerne zu verwenden.
quelle
Sie können https://github.com/douzi8/ajax-request#download verwenden
quelle
ajax-request
es sich nicht um eine Drittanbieter-Bibliothek handelt?Download mit Versprechen, die einen lesbaren Stream auflösen. Setzen Sie zusätzliche Logik ein, um die Umleitung zu handhaben.
quelle
Wenn Sie Express verwenden, verwenden Sie die Methode res.download (). sonst fs Modul verwenden.
(oder)
quelle
Von meiner Antwort auf "Was ist der Unterschied zwischen .pipe und .pipeline in Streams" .
quelle
Pfad: img Typ: jpg zufällige Uniqid
quelle
Ohne Bibliothek könnte es fehlerhaft sein, nur um darauf hinzuweisen. Hier sind ein paar:
Protocol "https:" not supported.
Hier mein Vorschlag:
wget
oder aufcurl
var wget = require('node-wget-promise'); wget('http://nodejs.org/images/logo.svg');
quelle
quelle
Sie können versuchen
res.redirect
, die Download-URL für die https-Datei zu verwenden. Anschließend wird die Datei heruntergeladen.Mögen:
res.redirect('https//static.file.com/file.txt');
quelle
quelle
Hier ist noch eine andere Möglichkeit, ohne Abhängigkeit von Drittanbietern damit umzugehen und auch nach Weiterleitungen zu suchen:
quelle
download.js (dh /project/utils/download.js)
app.js.
quelle
Wir können das Download-Knoten-Modul verwenden und es ist sehr einfach. Weitere Informationen finden Sie unter https://www.npmjs.com/package/download
quelle
quelle