You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Puppeteer在Google Cloud Functions中下载文件未存入/tmp文件夹如何解决

问题核心原因
  • 固定等待waitForTimeout(4000)逻辑不可靠:下载速度受网络、目标站点响应速度影响,4秒内未完成下载时,提前读取目录自然找不到文件,这是随机成功的核心原因
  • 硬编码文件名存在匹配偏差:代码中定义的文件名为test-report.pdf,但报错提示找不到的是report.pdf,站点实际生成的下载文件名可能和预设值不一致
  • 未监听下载完成的异步状态:没有利用Puppeteer原生的下载监听能力,无法精准判断下载是否完成
修复方案

直接使用Puppeteer提供的download事件监听下载完成状态,替代固定超时逻辑,同时可以直接获取下载文件的真实路径,无需硬编码文件名拼接路径,修正后的代码如下:

const page = await browser.newPage();
await page.setDefaultNavigationTimeout(0);
await page.goto(url);

const downloadPath = os.tmpdir(); 
// 设置下载行为,适配Puppeteer v10版本参数要求
await page._client.send('Page.setDownloadBehavior', {
    behavior: 'allow',
    downloadPath
});

await page.reload({ waitUntil: 'networkidle0' });

// 触发下载同时监听下载完成事件
const [download] = await Promise.all([
  page.waitForEvent('download'), // 等待下载完成后才会继续执行后续逻辑
  page.click('#screenshot') // 触发下载操作
]);

// 直接获取下载完成的文件路径,不需要硬编码文件名
const filePath = await download.path();
// 也可以通过 download.suggestedFilename() 获取站点返回的真实文件名
console.log('下载完成的文件名:', download.suggestedFilename());

// 读取文件转base64
const content = fs.readFileSync(filePath).toString("base64");

await page.close();
额外注意事项
  • Google Cloud Functions的/tmp目录为内存文件系统,容量上限为10GB,需确保下载的文件大小不超出限制
  • 若下载文件较大耗时较长,需要调整Cloud Functions的超时配置,避免函数在下载完成前被强制终止
  • 如果不需要持久化存储文件,可以直接调用download.createReadStream()读取文件流,不需要写入本地后再读取

内容的提问来源于stack exchange,提问作者Tushar Rmesh Saindane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 17:24:04