gpt4 book ai didi

node.js - 我们可以以某种方式重命名使用 puppeteer 下载的文件吗?

转载 作者:太空宇宙 更新时间:2023-11-03 22:48:54 25 4
gpt4 key购买 nike

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

我想过使用 Node 的 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.

最佳答案

您有两个选择:

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

选项 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 header 。之后,您必须等到文件下载完毕(例如文件存在并且文件大小没有改变),然后您才能重命名它。

<小时/>

选项 2:使用 Chrome DevTools 协议(protocol)修改响应 header

我 99% 确信这是可能的。您需要拦截当前的响应 not supported由 puppeteer 师本身。但由于 Chrome DevTools 协议(protocol)支持此功能,因此您可以使用低级协议(protocol)来使用它。

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

这个想法是这样的:

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

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

关于node.js - 我们可以以某种方式重命名使用 puppeteer 下载的文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57408918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com