J'essaye d'écrire un script pour télécharger des images en utilisant node.js. Voici ce que j'ai jusqu'à présent:
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();
}
Cependant, je veux rendre cela plus robuste:
- Existe-t-il des bibliothèques qui font cela et qui le font mieux?
- Y a-t-il une chance que les en-têtes de réponse se trouvent (sur la longueur, sur le type de contenu)?
- Y a-t-il d'autres codes de statut dont je devrais me préoccuper? Dois-je me soucier des redirections?
- Je pense avoir lu quelque part que l'
binary
encodage allait être obsolète. Que dois-je faire alors? - Comment puis-je faire fonctionner cela sur Windows?
- Y a-t-il d'autres moyens d'améliorer ce script?
Pourquoi: pour une fonctionnalité similaire à imgur où les utilisateurs peuvent me donner une URL, je télécharge cette image et je réhéberge l'image dans plusieurs tailles.
image
node.js
image-processing
download
Jonathan Ong
la source
la source
J'ai rencontré ce problème il y a quelques jours, pour une réponse pure NodeJS, je suggérerais d'utiliser Stream pour fusionner les morceaux ensemble.
Les dernières versions de Node ne fonctionneront pas bien avec les chaînes binaires, donc fusionner des morceaux avec des chaînes n'est pas une bonne idée lorsque vous travaillez avec des données binaires.
* Faites juste attention lorsque vous utilisez 'data.read ()', cela videra le flux pour la prochaine opération 'read ()'. Si vous souhaitez l'utiliser plusieurs fois, rangez-le quelque part.
la source
Vous pouvez utiliser Axios (un client HTTP basé sur la promesse pour Node.js) pour télécharger des images dans l'ordre de votre choix dans un environnement asynchrone :
Ensuite, vous pouvez utiliser l'exemple de base suivant pour commencer à télécharger des images:
la source
download_image
pour capturer les événements 'finish' et 'error' pour la promesse retournéesi vous voulez un téléchargement progressif, essayez ceci:
comment utiliser:
Remarque: vous devez installer les modules de requête et de progression de la requête en utilisant:
la source
statusCode
chèque. Un statusCode 500 par exemple, n'atteindra pas le'on("error", e)
. En ajoutant un,on('response', (response) => console.error(response.statusCode))
il facilite grandement le débogage,Sur la base de ce qui précède, si quelqu'un a besoin de gérer des erreurs dans les flux d'écriture / lecture, j'ai utilisé cette version. Notez
stream.read()
qu'en cas d'erreur d'écriture, c'est nécessaire pour que nous puissions terminer la lecture et déclencherclose
sur le flux de lecture.la source
stream.read()
semble être obsolète, lance une erreurnot a function
la source
Ceci est une extension de la réponse de Cezary. Si vous souhaitez le télécharger dans un répertoire spécifique, utilisez ceci. Utilisez également const au lieu de var. C'est sûr de cette façon.
la source