已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
四年前关闭了。
Improve this question
我正在尝试编写一个脚本来使用node.js下载图像。这是我目前所拥有的:
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();
}
不过,我想让它更健壮一些:
1.有没有图书馆能做到这一点,而且做得更好?
1.响应头是否有可能说谎(关于长度、关于内容类型)?
1.还有其他我应该关心的状态码吗?我应该麻烦重定向吗?
1.我想我在哪里读到过binary
编码将被弃用。然后我该怎么办?
1.我怎样才能让它在windows上工作?
1.你还有什么办法可以让这个剧本更好吗?
原因:对于一个类似于imgur的特性,用户可以给予我一个URL,我下载了这个图像,并以多种大小重新托管了这个图像。
7条答案
按热度按时间klh5stk11#
我建议使用request module,下载文件就像下面的代码一样简单:
6qftjkof2#
几天前我遇到了这个问题,对于一个纯粹的NodeJS答案,我建议使用Stream将块合并在一起。
最新的Node版本不能很好地处理二进制字符串,因此在处理二进制数据时,将块与字符串合并不是一个好主意。
ut6juiuv3#
您可以使用**Axios**(Node.js的基于promise的HTTP客户端)按照您在asynchronous environment中选择的顺序下载图像:
然后,您可以使用以下基本示例开始下载映像:
7uhlpewt4#
zpf6vheq5#
如果你想要进度下载,试试这个:
使用方法:
注意:您应该使用以下命令安装request和request-progress模块:
62o28rlo6#
这是Cezary答案的一个扩展。如果你想把它下载到一个特定的目录,使用这个。另外,使用const代替var。这样是安全的。
eqqqjvef7#
基于以上内容,如果有人需要处理写/读流中的错误,我使用了这个版本。注意
stream.read()
在写错误的情况下,它是必需的,这样我们就可以完成阅读并在读流上触发close
。