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

如何用Node.js在Web应用中从Azure Blob Storage提供HTML文件?

解决从Azure Blob Storage返回HTML文件的问题

首先,你之前的两种方法都用错了res.sendFile——这个方法的作用是读取本地文件系统中的文件路径并返回,不能直接传入字符串内容或者DOM对象,这是核心问题。下面是两种正确的实现方式:

方法一:直接流式传输(推荐,性能更高)

不需要把整个文件读进内存,直接将Blob的下载流pipe到响应对象,同时设置正确的Content-Type:

const { BlobServiceClient } = require('@azure/storage-blob');

// 初始化Blob客户端(建议放在路由外,避免每次请求都创建)
const blobServiceClient = BlobServiceClient.fromConnectionString(
    process.env.AZURE_STORAGE_CONNECTION_STRING
);
const containerClient = blobServiceClient.getContainerClient(
    process.env.AZURE_STORAGE_CONTAINER
);

app.get('/analytics/example', async (req, res) => {
    try {
        const blobClient = containerClient.getBlobClient(process.env.AZURE_STORAGE_BLOB);
        // 检查Blob是否存在
        const exists = await blobClient.exists();
        if (!exists) {
            return res.status(404).send('File not found');
        }

        // 获取Blob属性,拿到正确的Content-Type
        const blobProperties = await blobClient.getProperties();
        res.set('Content-Type', blobProperties.contentType || 'text/html');

        // 下载流并pipe到响应
        const downloadResponse = await blobClient.download(0);
        downloadResponse.readableStreamBody.pipe(res);
    } catch (err) {
        console.error(err);
        res.status(500).send('Server error');
    }
});

方法二:读取Blob内容后返回

如果需要先处理HTML内容再返回,可以读取成字符串后用res.send()返回:

async function streamToText(readable) {
    readable.setEncoding('utf8');
    let data = '';
    for await (const chunk of readable) {
        data += chunk;
    }
    return data;
};

app.get('/analytics/example', async (req, res) => {
    try {
        const blobClient = containerClient.getBlobClient(process.env.AZURE_STORAGE_BLOB);
        const exists = await blobClient.exists();
        if (!exists) {
            return res.status(404).send('File not found');
        }

        const downloadResponse = await blobClient.download(0);
        const htmlContent = await streamToText(downloadResponse.readableStreamBody);
        
        // 设置Content-Type并返回内容
        res.set('Content-Type', 'text/html');
        res.send(htmlContent);
    } catch (err) {
        console.error(err);
        res.status(500).send('Server error');
    }
});

为什么你的方法失败?

  • 第一种方法:res.sendFile(blob)中,blob是字符串内容,但res.sendFile需要传入本地文件的路径(比如./app/analysis/example_file.html),所以会报错找不到文件。
  • 第二种方法:res.sendFile(doc.body)传入的是DOM对象,同样不符合res.sendFile的参数要求,而且解析DOM完全没必要,直接返回原始HTML字符串即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:15:43