【问题标题】:Fetching URLs via JS resulting in empty files通过 JS 获取 URL 导致空文件
【发布时间】:2022-01-22 12:26:53
【问题描述】:

我想要做的只是有一个漂亮而简单的函数,它将获取一个 url 并将其保存到一个文件中,但是我或一些 JS 开发人员朋友一整天都能够提出的每一个实现都给出了最终结果相同:一个空文件

import * as fs from 'fs';
import * as path from 'path';
import fetch from 'node-fetch';
import { Headers } from 'node-fetch';

export function downloadURL(url, saveLocation) {
    const absSaveLocation = path.resolve(saveLocation);

    const myHeaders = new Headers();
    myHeaders.append('User-Agent', 'hifumi-js:v1.0.0');

    if (url.includes("pximg")) {
      myHeaders.append('Referer', 'https://www.pixiv.net/');
    }

    const requestOptions = {
      method: 'GET',
      headers: myHeaders,
    }

    const fileStream = fs.createWriteStream(absSaveLocation);
    fetch(url, requestOptions)
      .then(res => res.body.pipe(fileStream))
      .catch(error => console.log('error', error));
    fileStream.on('finish', () => {fileStream.close();});
}

我尝试了一堆不同的库,包括 https、request、fetch、axios,它们都给了我同样无用的空文件。它也不能是 url,因为它在下载之前首先与正则表达式匹配,并且我已经确认了无数不同的 url。

【问题讨论】:

  • node-fetch 在流式传输方面存在问题。你可以试试undici。另请参阅此article 以供参考。
  • 不幸的是,当将 node-fetch 换成 undici 时,结果相同,感谢您的文章,尽管阅读内容很有趣
  • 您的代码对我有用。我怀疑问题是您在调用downloadURL 后尝试立即读取该文件,而该文件仍然为空。
  • 看来你是对的,如果我切断了在 downloadURL 之后运行的所有代码,那么它会下载整个图像,如果我只切断几行然后仅下载图像的一部分。 fileStream.on('finish', () => {fileStream.close();}); 不应该让它写入文件直到它完成吗?

标签: javascript node.js fetch-api


【解决方案1】:

所以我最终自己解决了这个问题,放弃了尝试使用流写入文件的整个想法。

const fileStream = fs.createWriteStream(absSaveLocation);
    fetch(url, requestOptions)
      .then(res => res.body.pipe(fileStream))
      .catch(error => console.log('error', error));
    fileStream.on('finish', () => {fileStream.close();});

现在变成了

await fetch(url, requestOptions)
      .then(response => response.arrayBuffer())
      .then(buffer => fs.writeFile(absSaveLocation, new Uint8Array(buffer)))
      .catch(error => console.log('error', error));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 2014-11-13
    • 2013-11-12
    • 2012-03-08
    • 1970-01-01
    • 2020-08-04
    • 2013-10-29
    • 2014-05-14
    相关资源
    最近更新 更多