您有两种选择:
- 监视请求/响应以记录文件名并通过Node.js重命名
- 使用Chrome DevTools协议修改响应标头
选项1:监控请求/响应
这是最简单的方法。监视所有响应,以防万一您注意到正在下载的响应,请使用名称通过本地重命名
fs.rename。
代码样例
const path = require('path');// ...page.on('response', response => { const url = response.request().url(); const contentType = r.headers()['content-type']; if () { const fileName = path.basename(r.request().url()); // handle and rename file name (after making sure it's downloaded) }});该代码侦听所有响应并等待特定的模式(例如
contentType ==='application/pdf')。然后,它从请求中获取文件名。根据您的用例,您可能还需要检查
Content-Disposition标题。之后,您必须等待文件下载完毕(例如,文件存在且文件大小不变),然后才能对其进行重命名。
选项2:使用Chrome DevTools协议修改响应标头
我99%确信,这是可能的。您需要截获人偶本身当前不支持的响应。但是,由于Chrome
DevTools协议支持此功能,因此可以使用低级协议来使用它。
想法是拦截响应并将
Content-Disposition标头更改为所需的文件名。
这里是想法:
- 使用
chrome-remote-interface
或CDP会话激活Network.requestIntercepted
- 听
Network.requestIntercepted
事件 - 发送
Network.getResponseBodyForInterception
以接收响应的正文 - 修改正文并添加(或更改)
Content-Disposition
标题以包含文件名 - 致电
Network.continueInterceptedRequest
修改后的回复
然后,应使用修改后的文件名保存文件。在github上查看此注释以获取代码示例。正如我已经解释的那样,只要操纵up不支持修改响应,这是一种相当复杂的方法。



