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

