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

JavaScript中发送Zip Buffer到SharePoint解决上传损坏问题的正确方法

你遇到的zip文件上传后无法读取的问题,核心由3个配置错误导致:

  1. 未正确配置Content-Type请求头,SharePoint无法识别二进制流为zip格式,写入时做了错误的编码转换
  2. 调用fs.readFileSync(...).buffer获取的ArrayBuffer携带了Buffer实例的底层偏移量,直接传递会导致文件内容包含多余的空字节,最终zip损坏
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:06:03