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

Azure Functions Linux Node.js 文件存读异常问题咨询

Azure Function App中Puppeteer下载文件读取失败的解决思路

你遇到的问题核心不是Azure Function App的特殊配置,而是Chrome下载流程的临时文件特性,加上监听逻辑的偏差:

问题根源

.crdownload是Chrome浏览器下载过程中生成的临时文件,只有当下载完全完成后,浏览器才会将这个临时文件重命名为最终的目标文件(比如.csv)。如果你在捕获到这个临时文件时就尝试读取,要么文件还在写入中无法正常读取,要么下载完成后该临时文件已经被删除,自然会提示“文件不存在”。

正确的处理方式

放弃监听文件夹变化的方案,改用Puppeteer原生的下载事件监听,等待下载完成后再操作文件:

const puppeteer = require('puppeteer');
const path = require('path');
const fs = require('fs');
const os = require('os');

module.exports = async function (context, req) {
    const downloadPath = path.join(os.tmpdir(), 'downloads');
    // 确保下载目录存在
    if (!fs.existsSync(downloadPath)) {
        fs.mkdirSync(downloadPath, { recursive: true });
    }

    const browser = await puppeteer.launch({
        // Linux环境下运行需要添加以下配置
        args: ['--no-sandbox', '--disable-setuid-sandbox']
    });
    const page = await browser.newPage();

    // 配置浏览器允许下载并指定路径
    await page._client.send('Page.setDownloadBehavior', {
        behavior: 'allow',
        downloadPath: downloadPath
    });

    // 导航到目标页面并触发下载(替换成你的实际操作)
    await page.goto('https://your-target-page.com');
    await page.click('#download-report-btn'); // 替换成下载按钮的选择器

    // 监听下载事件,等待完成后处理文件
    page.on('download', async (download) => {
        try {
            // 等待下载完成,获取最终文件名
            const finalFilename = await download.waitForCompletion();
            const finalFilePath = path.join(downloadPath, finalFilename);

            // 此时文件已完全生成,可以正常读取
            if (fs.existsSync(finalFilePath)) {
                const fileContent = fs.readFileSync(finalFilePath, 'utf8');
                context.log('文件读取成功:', fileContent.slice(0, 100)); // 输出前100字符验证
                // 这里可以添加文件上传到Blob Storage等持久化操作
            }
        } catch (err) {
            context.log.error('下载或读取文件失败:', err);
        } finally {
            await browser.close();
        }
    });
};

Azure Function App环境的注意事项

  1. 临时存储限制:/tmp是函数实例的临时存储,实例回收或冷启动时会被清空,处理完文件后务必及时上传到Azure Blob Storage等持久化存储服务。
  2. 运行环境依赖:如果是Linux环境的Function App,Puppeteer需要额外的系统依赖,你可以通过以下方式解决:
    • 在应用设置中添加WEBSITE_RUN_FROM_PACKAGE = 1,确保部署包包含所有依赖。
    • 使用预安装了Puppeteer依赖的自定义容器镜像部署函数。
  3. 执行时间限制:消费计划下函数最长运行时间为10分钟,若下载大文件可能超时,建议改用高级计划或专用计划。

内容的提问来源于stack exchange,提问作者Smiter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:07:37