我正在通过操纵up将文件下载到我的目录中。我需要将此文件上传到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.
答案 0 :(得分:3)
您有两个选择:
这是最简单的方法。监视所有响应,以防万一您注意到正在下载的响应,请使用名称通过fs.rename
在本地重命名。
代码示例
const path = require('path');
// ...
page.on('response', response => {
const url = response.request().url();
const contentType = r.headers()['content-type'];
if (/* URL and/or contentType matches pattern */) {
const fileName = path.basename(r.request().url());
// handle and rename file name (after making sure it's downloaded)
}
});
该代码侦听所有响应并等待特定的模式(例如contentType === 'application/pdf'
)。然后,它从请求中获取文件名。根据您的用例,您可能还需要检查Content-Disposition
标头。之后,您必须等到文件下载完毕(例如,文件存在且文件大小未更改),然后才能对其进行重命名。
我敢肯定,这是可能的。您需要通过操纵up本身拦截当前为not supported的响应。但是,由于Chrome DevTools协议支持此功能,因此可以使用低级协议来使用它。
这个想法是拦截响应并将Content-Disposition
标头更改为所需的文件名。
这里是个主意:
chrome-remote-interface
或CDP Session激活Network.requestIntercepted
Network.requestIntercepted
事件Network.getResponseBodyForInterception
以接收响应的正文Content-Disposition
标头以包含文件名Network.continueInterceptedRequest
然后,应使用修改后的文件名保存文件。检出this comment on github以获得代码示例。正如我已经解释的那样,只要操纵up不支持修改响应,这是一种相当复杂的方法。