Ich versuche, ein Skript zum Herunterladen von Bildern mit node.js zu schreiben. Das habe ich bisher:
var maxLength = 10 // 10mb
var download = function(uri, callback) {
http.request(uri)
.on('response', function(res) {
if (res.headers['content-length'] > maxLength*1024*1024) {
callback(new Error('Image too large.'))
} else if (!~[200, 304].indexOf(res.statusCode)) {
callback(new Error('Received an invalid status code.'))
} else if (!res.headers['content-type'].match(/image/)) {
callback(new Error('Not an image.'))
} else {
var body = ''
res.setEncoding('binary')
res
.on('error', function(err) {
callback(err)
})
.on('data', function(chunk) {
body += chunk
})
.on('end', function() {
// What about Windows?!
var path = '/tmp/' + Math.random().toString().split('.').pop()
fs.writeFile(path, body, 'binary', function(err) {
callback(err, path)
})
})
}
})
.on('error', function(err) {
callback(err)
})
.end();
}
Ich möchte dies jedoch robuster machen:
- Gibt es Bibliotheken, die dies tun und dies besser machen?
- Gibt es eine Chance, dass Antwortheader lügen (ungefähr Länge, Inhaltstyp)?
- Gibt es andere Statuscodes, die mich interessieren sollten? Sollte ich mich um Weiterleitungen kümmern?
- Ich glaube, ich habe irgendwo gelesen, dass die
binary
Codierung veraltet sein wird. Was mache ich dann? - Wie kann ich das unter Windows zum Laufen bringen?
- Gibt es noch andere Möglichkeiten, wie Sie dieses Skript verbessern können?
Warum: Für eine ähnliche Funktion wie imgur, bei der Benutzer mir eine URL geben können, lade ich dieses Bild herunter und stelle das Bild in mehreren Größen erneut bereit.
image
node.js
image-processing
download
Jonathan Ong
quelle
quelle
Ich bin vor einigen Tagen auf dieses Problem gestoßen. Für eine reine NodeJS-Antwort würde ich vorschlagen, Stream zu verwenden, um die Chunks zusammenzuführen.
Die neuesten Node-Versionen funktionieren nicht gut mit binären Zeichenfolgen. Daher ist das Zusammenführen von Chunks mit Zeichenfolgen keine gute Idee, wenn Sie mit binären Daten arbeiten.
* Seien Sie vorsichtig, wenn Sie 'data.read ()' verwenden. Dadurch wird der Stream für die nächste Operation 'read ()' geleert. Wenn Sie es mehrmals verwenden möchten, bewahren Sie es irgendwo auf.
quelle
Sie können Axios (einen auf Versprechen basierenden HTTP-Client für Node.js) verwenden, um Bilder in der Reihenfolge Ihrer Wahl in einer asynchronen Umgebung herunterzuladen :
Anschließend können Sie anhand des folgenden Basisbeispiels mit dem Herunterladen von Bildern beginnen:
quelle
download_image
, um das Ereignis 'Beenden' und 'Fehler' für das zurückgegebene Versprechen zuWenn Sie den Fortschritt herunterladen möchten, versuchen Sie Folgendes:
wie benutzt man:
Hinweis: Sie sollten sowohl Anforderungs- als auch Anforderungsfortschrittsmodule installieren, indem Sie:
quelle
statusCode
Scheck hinzuzufügen . Ein 500 statusCode zum Beispiel trifft den nicht'on("error", e)
. Durch Hinzufügen eineson('response', (response) => console.error(response.statusCode))
erleichtert es das Debuggen erheblich,Aufbauend auf dem oben Gesagten habe ich diese Version verwendet, wenn jemand Fehler in den Schreib- / Lesestreams behandeln muss. Beachten Sie, dass
stream.read()
im Falle eines Schreibfehlers dieser erforderlich ist, damit wir das Lesen beenden und den Lesestream auslösen könnenclose
.quelle
stream.read()
scheint veraltet zu sein, wirft einen Fehlernot a function
quelle
Dies ist eine Erweiterung von Cezarys Antwort. Wenn Sie es in ein bestimmtes Verzeichnis herunterladen möchten, verwenden Sie dieses. Verwenden Sie außerdem const anstelle von var. Auf diese Weise ist es sicher.
quelle