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
相关产品推荐
相关产品推荐

