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

使用NodeJS从Azure Data Lake Storage下载Excel文件提示压缩包损坏如何解决

问题根因

你当前代码的核心错误是将二进制格式的xlsx文件流强制转换为UTF-8字符串。xlsx本质是zip压缩的二进制文件,调用data.toString()会破坏二进制编码结构,导致写入本地的文件本身就是损坏的,所以读取时会报zip损坏错误。

修复方案

1. 流处理逻辑替换为二进制Buffer收集

删除原有的streamToString方法,替换为收集二进制Buffer的逻辑:

// 替换原有streamToString方法
async function streamToBuffer(readableStream) {
    return new Promise((resolve, reject) => {
        const chunks = [];
        readableStream.on("data", (data) => {
            chunks.push(data instanceof Buffer ? data : Buffer.from(data));
        });
        readableStream.on("end", () => {
            resolve(Buffer.concat(chunks));
        });
        readableStream.on("error", reject);
    });
}

2. 调整下载和写入逻辑

将下载后的流处理调用替换为Buffer处理,写入文件时直接传入Buffer:

// 替换原有下载和写文件逻辑
const downloadResponse = await fileClient.read();
const fileBuffer = await streamToBuffer(downloadResponse.readableStreamBody);

// 写入本地文件,同步方法不需要传回调
fs.writeFileSync('excel.xlsx', fileBuffer);

可选优化:跳过临时文件写入

exceljs支持直接读取Buffer,可省略磁盘IO步骤,提升性能:

// 不需要写文件,直接读取Buffer
await wb.xlsx.load(fileBuffer).then(function() {
    context.log('here2');
    var sh = wb.getWorksheet('Sheet 1');
    context.log(sh.getRow(7));
});
// 后续也不需要调用unlink删除临时文件

额外注意事项

Azure Function中不建议在/home/site/wwwroot路径下写入临时文件,该路径是函数代码部署目录,权限限制严格,推荐使用系统临时目录/tmp存储临时文件。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:18:00