【问题标题】:Can we somehow rename the file that is being downloaded using puppeteer?我们可以以某种方式重命名正在使用 puppeteer 下载的文件吗?
【发布时间】:2021-02-06 08:49:15
【问题描述】:

我正在通过 puppeteer 将文件下载到我的目录中。我需要将此文件上传到 s3 存储桶,因此我需要获取文件名。但问题是,这个文件名有一个每次都会改变的时间戳,所以我不能保留一个硬编码的名称。那么有没有办法每次都获得一个常量名称(即使旧文件被替换),或者如何重命名正在下载的文件?

我曾想过使用节点的 fs.rename() 函数,但这又需要当前文件名。

我想要一个固定的文件名来硬编码,然后上传到 s3 存储桶中。

  await page._client.send('Page.setDownloadBehavior', {behavior: 'allow', downloadPath: './xml'}); // This sets the directory

  await page.keyboard.press('Tab');

  await page.keyboard.press('Enter'); // This downloads an XML file.

【问题讨论】:

  • 能否请您添加用于下载文件的代码?

标签: node.js puppeteer


【解决方案1】:

你有两个选择:

  1. 监控请求/响应以记录文件名并通过 Node.js 重命名
  2. 使用 Chrome DevTools 协议修改响应头

选项 1:监控请求/响应

这是最直接的方法。监控所有响应,如果您注意到正在下载的响应,请使用名称通过 fs.rename 在本地重命名它。

代码示例

const path = require('path');

// ...
page.on('response', response => {
    const url = response.request().url();
    const contentType = response.headers()['content-type'];
    if (/* URL and/or contentType matches pattern */) {
        const fileName = path.basename(response.request().url());
        // handle and rename file name (after making sure it's downloaded)
    }
});

代码侦听所有响应并等待特定模式(例如contentType === 'application/pdf')。然后它从请求中获取文件名。根据您的用例,您可能还需要检查 Content-Disposition 标头。之后,您必须等到文件下载完毕(例如文件存在且文件大小不变),然后才能重命名。


选项 2:使用 Chrome DevTools 协议修改响应头

我有 99% 的把握,这是可能的。您需要通过 puppeteer 本身拦截当前为 not supported 的响应。但由于 Chrome DevTools 协议支持此功能,您可以使用低级协议来使用它。

想法是拦截响应并将Content-Disposition 标头更改为您想要的文件名。

这是一个想法:

  1. 使用chrome-remote-interfaceCDP Session 激活Network.requestIntercepted
  2. 收听Network.requestIntercepted事件
  3. 发送Network.getResponseBodyForInterception 以接收响应正文
  4. 修改正文并添加(或更改)Content-Disposition 标头以包含您的文件名
  5. 致电Network.continueInterceptedRequest 并提供修改后的回复

然后您的文件应使用修改后的文件名保存。查看this comment on github 获取代码示例。正如我已经解释过的,只要 puppeteer 不支持修改响应,这是一种相当复杂的方法。

【讨论】:

  • 明白了要点。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-06-14
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
相关资源
最近更新 更多