使用JSZip的optimizedBinaryString选项生成ZIP内Excel文件失败求指导
解决JSZip中optimizedBinaryString选项的使用问题
问题根源
你传入的str是带0x前缀的十六进制字符串,但optimizedBinaryString: true要求的是每个字符的Unicode码点对应文件原始字节值的二进制字符串(即通过String.fromCharCode(byte & 0xFF)生成的字符串),两者格式完全不匹配,导致压缩后的文件损坏。
正确处理步骤
先把SQL Server返回的十六进制字符串转换成JSZip能识别的格式,再添加到压缩包:
方法1:转换为Uint8Array(推荐,更直观可靠)
JSZip原生支持TypedArray类型,无需额外配置选项:
var zip = new JSZip(); let str = "0x504B03041400060008....................."; // 移除字符串开头的0x前缀 const hexContent = str.replace(/^0x/, ''); // 将十六进制字符串转为Uint8Array const byteArray = new Uint8Array(hexContent.length / 2); for (let i = 0; i < hexContent.length; i += 2) { byteArray[i / 2] = parseInt(hexContent.substr(i, 2), 16); } // 直接传入Uint8Array即可 zip.file("Some.xlsx", byteArray); zip.generateAsync({ type: "blob" }) .then(function (content) { saveAs(content, "archive.zip"); });
方法2:转换为符合要求的二进制字符串(使用optimizedBinaryString)
如果一定要用optimizedBinaryString选项,需要先把十六进制字符串转成标准二进制字符串:
var zip = new JSZip(); let str = "0x504B03041400060008....................."; const hexContent = str.replace(/^0x/, ''); const byteArray = new Uint8Array(hexContent.length / 2); for (let i = 0; i < hexContent.length; i += 2) { byteArray[i / 2] = parseInt(hexContent.substr(i, 2), 16); } // 将Uint8Array转为二进制字符串:每个字节对应一个字符 const binaryString = String.fromCharCode(...byteArray); // 此时传入binaryString并开启optimizedBinaryString zip.file("Some.xlsx", binaryString, { optimizedBinaryString: true }); zip.generateAsync({ type: "blob" }) .then(function (content) { saveAs(content, "archive.zip"); });
不同输入类型对应选项说明
- Base64字符串:使用
{base64: true}(就是你之前压缩图片成功的方式) - 二进制字符串:仅当字符串是通过
String.fromCharCode(byte & 0xFF)生成时,才需要开启optimizedBinaryString: true - TypedArray/Uint8Array/ArrayBuffer:无需额外选项,JSZip会自动识别处理
内容的提问来源于stack exchange,提问作者rpowell6
相关产品推荐
相关产品推荐

