Javascript 使用节点下载的图像为209字节,但可以在chrome中访问该图像
我正在通过node下载图像。在大多数情况下,这是正常工作的,但是有些图像是用Javascript 使用节点下载的图像为209字节,但可以在chrome中访问该图像,javascript,node.js,image,download,header,Javascript,Node.js,Image,Download,Header,我正在通过node下载图像。在大多数情况下,这是正常工作的,但是有些图像是用209字节保存的。但是当直接在Chrome浏览器中查看这些图像时,完全正常打开 标题 地位 使用的代码 向您的请求添加2个标题: Accept: image/jpeg Accept-Encoding: gzip, deflate 例如: request({ uri: uri, headers: { 'Accept': 'image/jpeg', 'Accept-Encoding': 'gzip,
209字节保存的。但是当直接在Chrome浏览器中查看这些图像时,完全正常打开
标题
地位
使用的代码
向您的请求添加2个标题:
Accept: image/jpeg
Accept-Encoding: gzip, deflate
例如:
request({
uri: uri,
headers: {
'Accept': 'image/jpeg',
'Accept-Encoding': 'gzip, deflate'
}
}).pipe(fs.createWriteStream(filename)).on('close', resolve);
编辑一些解释
问题出在服务器上,而不是客户端
因为在Chrome中它可以工作,所以您可以尝试通过将所有请求头复制到node.js代码中来模拟Chrome的请求
代码运行后,请尝试逐个删除,以查看所需内容。
对我来说,它只适用于提到的2个
const download = async function(uri, filename){
return new Promise((resolve, reject) => {
request.head(uri, function(err, res) {
if (res) {
request(uri).pipe(fs.createWriteStream(filename)).on('close', resolve);
} else {
reject(uri);
}
});
})
};
const downloadImages = async function (dirName, images){
if (await !fs.existsSync(dirName)){
await fs.mkdirSync(dirName);
}
await asyncForEach(JSON.parse(images), async (image, index) => {
const fileName = `${dirName}/${index}.jpg`;
try {
await readFile(fileName)
}
catch (err){
if(err) {
try {
await download(image, fileName);
} catch (error) {
console.error(error);
}
}
}
})
}
Accept: image/jpeg
Accept-Encoding: gzip, deflate
request({
uri: uri,
headers: {
'Accept': 'image/jpeg',
'Accept-Encoding': 'gzip, deflate'
}
}).pipe(fs.createWriteStream(filename)).on('close', resolve);