当前位置: 首页 > 面试题库 >

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

赫连黎昕
2023-03-14
问题内容

我正在通过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.

问题答案:

您有两种选择:

  1. 监视请求/响应以记录文件名并通过Node.js重命名
  2. 使用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 (/* 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标题。之后,您必须等待文件下载完毕(例如,文件存在且文件大小不变),然后才能对其进行重命名。

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

我99%确信,这是可能的。您需要截获人偶本身当前不支持的响应。但是,由于Chrome
DevTools协议支持此功能,因此可以使用低级协议来使用它。

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

这里是想法:

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

然后,应使用修改后的文件名保存文件。在github上查看此注释以获取代码示例。正如我已经解释的那样,只要操纵up不支持修改响应,这是一种相当复杂的方法。



 类似资料:
  • 问题内容: 我们可以重载Java中的方法吗? 问题答案: 您 可以 重载该方法,但仅在JVM启动您的类时使用。例如: 从命令行运行时,即使指定一个或两个命令行参数,该命令也 始终会 打印。 当然,您可以从代码中自己调用该方法-此时将应用常规的重载规则。 编辑:请注意,您可以使用varargs签名,因为从JVM的角度来看,这是等效的:

  • 实际上,我需要从我的应用程序中打开默认的下载文件夹。可以吗?如果可以,请提供一些参考。 我可以在以下帮助下获取下载文件夹的路径: 任何帮助都将不胜感激。

  • 问题内容: 实际上,我需要从应用程序中打开默认的“下载”文件夹。可能吗?如果是,请提供一些参考。 我可以借助以下方法获得“下载”文件夹的路径: 任何帮助将不胜感激。 问题答案: 您可以使用以下内容显示最近的下载活动 自API 9起可用

  • 问题内容: docker-compose文件https://docs.docker.com/compose/compose-file/#/volumes- volume-driver 显示了相对于compose文件安装主机子目录的各种方法。 例如: volumes:#只需指定一个路径,然后让Engine创建一个体积-/ var / lib / mysql #指定绝对路径映射-/ opt / dat

  • 问题内容: 我正在使用Selenium从此页面自动下载csv格式的文件: https://catalog.data.gov/dataset?tags=crime 这是我正在使用的代码: 此处设置了下载文件夹: 如何选择保存文件的名称?可以在下载时定义名称吗? 我的意思是这样的: 问题答案: 您无法控制通过selenium命名的下载文件 。 您可以使用目录观察者/观察者来检测文件何时下载,然后相应地

  • 我对maven有依赖性问题。我曾经拥有位于maven central的saxon 8.7。然后,我不得不升级到最新的saxon-B9.1。0.0,仅部分位于maven central上。 这是我的依赖项的一个片段: 第一个工件“saxon”在maven central上可用,但第二个工件“saxon dom”可用。这是我想要的人工制品。 我可以告诉maven下载“jar”文件吗?或者我必须下载ja