Javascript 使用节点下载的图像为209字节,但可以在chrome中访问该图像

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,

我正在通过node下载图像。在大多数情况下,这是正常工作的,但是有些图像是用
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);