我正在通过 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.
Run Code Online (Sandbox Code Playgroud)
您有两个选择:
这是最直接的方法。监视所有响应,如果您注意到正在下载的响应,请使用该名称通过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)
}
});
Run Code Online (Sandbox Code Playgroud)
代码侦听所有响应并等待特定模式(例如contentType === 'application/pdf')。然后它从请求中获取文件名。根据您的用例,您可能还需要检查Content-Disposition标题。之后,您必须等到文件下载完毕(例如文件存在且文件大小不变),然后您才能重命名它。
我 99% 肯定,这是可能的。您需要拦截puppeteer 本身目前不支持的响应。但由于 Chrome DevTools 协议支持此功能,您可以使用低级协议来使用它。
这个想法是拦截响应并将Content-Disposition标题更改为您想要的文件名。
这是一个想法:
chrome-remote-interface或CDP 会话来激活Network.requestInterceptedNetwork.requestIntercepted事件Network.getResponseBodyForInterception以接收响应正文Content-Disposition标题以包含您的文件名Network.continueInterceptedRequest使用您修改后的回复拨打电话然后,您的文件应使用修改后的文件名保存。在 github 上查看此评论以获取代码示例。正如我已经解释过的,只要 puppeteer 不支持修改响应,这是一种相当复杂的方法。
| 归档时间: |
|
| 查看次数: |
3290 次 |
| 最近记录: |