使用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设置允许你的域名访问:
- 进入Sanity Studio的项目设置 → API → CORS origins
- 添加你的域名(本地开发可填
http://localhost:3000) - 勾选"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
相关产品推荐
相关产品推荐

