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

使用Sanity Client上传视频文件报错,疑因lengthComputable?求解决方案

Sanity Client视频上传错误排查与解决

以下是针对你遇到的client.assets.upload上传视频失败问题的具体排查步骤和解决方案:

1. 明确错误本质

从错误截图来看,返回的是413 Payload Too Large错误,这是服务器拒绝接收过大文件的标准响应。Sanity默认文件上传上限是200MB,先检查你的视频文件大小是否超过这个限制:

  • 如果超过,先用HandBrake等工具压缩视频(降低码率/分辨率);付费计划用户可联系Sanity官方提升配额。

2. 验证selectedFile有效性

确保你传入的selectedFile是原生浏览器File对象(通常从<input type="file">获取),部分自定义处理后的文件对象可能丢失size属性,导致Sanity无法计算文件长度(也就是你怀疑的lengthComputable问题)。

快速验证代码:

console.log('文件详情:', {
  文件名: selectedFile.name,
  类型: selectedFile.type,
  大小: selectedFile.size,
  是否为File对象: selectedFile instanceof File
});

如果size为undefined或是否为File对象为false,需要调整文件获取逻辑,确保拿到原生File对象。

3. 手动传入文件大小参数

如果Sanity Client无法自动读取文件大小,可在上传配置里显式指定size参数,解决长度计算问题:

client.assets
  .upload('file', selectedFile, {
    contentType: selectedFile.type,
    filename: selectedFile.name,
    size: selectedFile.size // 手动传入文件大小
  })
  .then((data) => console.log('上传成功:', data))
  .catch((error) => console.log("上传失败: ", error));

4. 升级Sanity Client版本

旧版本的Client可能存在文件上传兼容性bug,优先升级到最新版:

# npm 用户
npm install @sanity/client@latest

# yarn 用户
yarn add @sanity/client@latest

5. 检查CORS配置(前端环境)

如果是在浏览器端上传,确保Sanity项目的CORS设置允许你的域名访问:

  1. 进入Sanity Studio的项目设置 → API → CORS origins
  2. 添加你的域名(本地开发可填http://localhost:3000)
  3. 勾选"Allow credentials"选项

6. 大文件分块上传(超过200MB时)

如果视频无法压缩且超过默认上限,使用Sanity的分块上传能力,示例代码如下:

async function 分块上传大文件(file) {
  const 分块大小 = 10 * 1024 * 1024; // 按10MB分块
  const 总分块数 = Math.ceil(file.size / 分块大小);

  for (let i = 0; i < 总分块数; i++) {
    const 起始位置 = i * 分块大小;
    const 结束位置 = Math.min(起始位置 + 分块大小, file.size);
    const 当前分块 = file.slice(起始位置, 结束位置);

    const 上传结果 = await client.assets.upload('file', 当前分块, {
      contentType: file.type,
      filename: file.name,
      chunk: {
        index: i,
        total: 总分块数,
        size: file.size
      }
    });

    if (i === 总分块数 - 1) {
      console.log('上传完成:', 上传结果);
      return 上传结果;
    }
  }
}

// 调用方法
分块上传大文件(selectedFile).catch(err => console.log('上传失败:', err));

内容的提问来源于stack exchange,提问作者David Pétur Brynjarsson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:45:33