JavaScript中发送Zip Buffer到SharePoint解决上传损坏问题的正确方法
你遇到的zip文件上传后无法读取的问题,核心由3个配置错误导致:
- 未正确配置
Content-Type请求头,SharePoint无法识别二进制流为zip格式,写入时做了错误的编码转换 - 调用
fs.readFileSync(...).buffer获取的ArrayBuffer携带了Buffer实例的底层偏移量,直接传递会导致文件内容包含多余的空字节,最终zip损坏 - axios默认会对请求体做字符串转换,未禁用该转换的情况下会破坏二进制流结构
正确实现代码
1. 读取zip文件获取Buffer
// 直接使用fs.readFileSync返回的Node Buffer即可,不要取.buffer属性 const zipBuffer = fs.readFileSync(exportedAppDataArchive.pathToFile);
2. 发送上传请求
const fileCollectionEndpoint = `${SITE}/_api/web/GetFolderByServerRelativeUrl('catalog')/Files/add(url='${encodeURIComponent(fileName)}',overwrite=true)`; await axiosInstance.post(fileCollectionEndpoint, zipBuffer, { // 禁用axios默认的请求体转换逻辑,避免破坏二进制流 transformRequest: [data => data], headers: { // 必须明确指定zip文件的Content-Type 'Content-Type': 'application/zip', // 若使用表单认证的请求摘要,替换为X-RequestDigest头 'X-RequestDigest': digest, // 若使用OAuth认证,保留Authorization头即可 // Authorization: `Bearer ${accessToken}`, Cookie: cookie } });
补充注意事项
- 文件名需要用
encodeURIComponent编码,避免文件名包含特殊字符时SharePoint识别异常 - 若zip文件大小超过16MB,不能直接使用当前add接口,需要用
startUpload/continueUpload/finishUpload组合的分片上传逻辑,避免触发大小限制 - 若目标SharePoint库开启了强制签入,上传完成后需要调用
${fileEndpoint}/CheckIn(comment='上传完成', checkintype=0)接口完成签入,否则文件会处于暂存状态无法公开访问 - 可通过比对本地zip文件MD5和上传后SharePoint返回的文件
vti_sourcemd5属性,确认文件传输过程中无损坏
内容的提问来源于stack exchange,提问作者Chrisss
相关产品推荐
相关产品推荐

