Télécharger des images avec node.js
Je suis en train d'écrire un script pour télécharger des images à l'aide de node.js. C'est ce que j'ai à ce jour:
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();
}
Toutefois, je veux pour le rendre plus robuste:
- Sont là des bibliothèques de faire ceci et faire cela mieux?
- Est-il une chance que les en-têtes de réponse au mensonge (à propos de longueur, sur un type de contenu)?
- Il d'autres codes d'état, je devrait s'en inquiéter? Dois-je la peine avec les redirections?
- Je pense que j'ai lu quelque part que
binary
encodage va être obsolète. Que dois-je faire ensuite? - Comment puis-je obtenir que cela fonctionne sur windows?
- Toutes les autres façons dont vous pouvez faire ce script mieux?
Pourquoi: pour une fonctionnalité similaire à imgur où les utilisateurs peuvent me donner une URL, j'ai télécharger cette image et lui donner l'image en plusieurs tailles.
Vous devez vous connecter pour publier un commentaire.
Je suggérerais à l'aide de la demande de module. Le téléchargement d'un fichier est aussi simple que le code suivant:
request.head
. J'ai édité mon exemple pour montrer le content-type et content-length avant de télécharger le fichier.request-promise
module. E. g.let fileContents = await request(myUrl)
J'ai rencontré ce problème il y a quelques jours, pour un pur NodeJS réponse, je voudrais suggérer à l'aide de Flux de fusionner les morceaux ensemble.
Le nouveau Nœud versions ne fonctionnent pas bien avec les chaînes binaires, donc la fusion des morceaux avec des cordes n'est pas une bonne idée lorsque l'on travaille avec des données binaires.
*Juste être prudent lors de l'utilisation de vos données.read ()", il va vider le flux pour le prochain 'read()' opération. Si vous souhaitez l'utiliser plus d'une fois, les stocker quelque part.
Vous pouvez utiliser Axios (un promessebase de client HTTP pour Node.js pour télécharger les images dans l'ordre de votre choix dans un environnement asynchrone:
Ensuite, vous pouvez utiliser l'exemple simple suivant pour commencer le téléchargement des images:
download_image
pour capturer le "fini" et "erreur" de l'événement pour le retour de la promessesi vous voulez progrès télécharger essayez ceci:
comment utiliser:
remarque: vous devez installer à la fois la demande & demande-le progrès des modules à l'aide de:
statusCode
vérifier. 500 statusCode par exemple, ne sera pas touché le'on("error", e)
. Par l'ajout d'unon('response', (response) => console.error(response.statusCode))
il facilite grandement le débogage,De construction sur le dessus, si quelqu'un a besoin de gérer les erreurs dans la lecture/écriture de flux, j'ai utilisé cette version. Remarque le
stream.read()
dans le cas d'une erreur d'écriture, il est nécessaire, de sorte que nous pouvons terminer la lecture et de déclencherclose
sur la lecture de flux.stream.read()
semble être obsolète, déclenche une erreurnot a function
C'est une extension de Cezary de réponse. Si vous voulez le télécharger dans un répertoire spécifique, l'utilisation de ce. Aussi, l'utilisation de const au lieu de var. Son coffre de cette façon.