【问题标题】:Is it possible to know the name of a file that is being downloaded or to set a name before download?是否可以知道正在下载的文件的名称或在下载前设置名称?
【发布时间】:2019-10-26 09:48:20
【问题描述】:

我正在使用 puppeteer 下载大量文件,但我需要在下载完成之前或之后知道每个文件的名称。监视文件夹以进行文件更改并不能解决我的问题,因为许多进程同时下载文件并且现在有办法匹配它们。

我一直在尝试为每个文件设置一个自定义下载路径,但 Puppeteer 做了一些奇怪的事情,一些下载到该文件夹​​,而另一些到 /Downloads。

所以,我想知道是否有办法在下载之前知道名称或在下载之前设置文件的名称。这样我就可以通过代码正确匹配了。

注意:文件是通过 JS 下载的,即单击按钮时。由于文件是自动生成的,因此无法通过 scraping 知道文件名。

【问题讨论】:

  • 你可能需要知道文件(donwload)的url,url可能包含文件名,如果可以的话,写一个node脚本直接使用那个url请求,这样你就知道了下载完成时,下载完成后可以写回调
  • 节点包请求[](github.com/request/request)
  • 另外,您需要在您的问题中添加更多信息,例如下载按钮的行为,以便其他人能够回答您的问题,可能在其中包含一些代码,以获取详细信息:stackoverflow.com/help/how-to-ask

标签: puppeteer


【解决方案1】:

如果下载是由页面触发的,则通过使用Content-Disposition 标头来完成。很可能,标头还包含文件名作为标头的一部分。

示例

下面是标题的示例:

Content-Disposition: attachment; filename="name_of_download.ext"

为了读取文件名,您可以通过查看response.headers() 来检查文件名。在下面的示例中,我在之后使用正则表达式来提取文件名:

const contentDisposition = response.headers()['content-disposition'];
const matchFilename = contentDisposition.match(/filename="(.*)"/);
if (matchFilename) {
  const filename = matchFilename[1];
}

非 ASCII 字符

根据您正在下载的文件,您可能还想查看stackoverflow answer,了解非 ASCII 文件名的编码。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2011-12-16
    • 2022-08-03
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多