LinkedIn视频API分片上传失败,报CORRUPTED_ENTITY错误求助
排查思路与解决建议
核心问题分析
收到CORRUPTED_ENTITY错误,说明上传的分片合并后视频文件损坏,你的代码存在两个关键错误导致该问题:
1. 二进制文件读取方式错误
你用fs.readFileSync(filepath, {encoding:'utf8', flag:'r'})读取视频文件,utf8编码会破坏二进制视频数据——视频属于二进制文件,不能用文本编码读取,必须读取原始二进制buffer。
修复方法:
移除encoding:'utf8'参数,直接读取二进制buffer:
const buffer = fs.readFileSync(filepath); // 无encoding参数,返回原始Buffer类型
2. 分片切片的区间计算错误
LinkedIn要求分片大小为4194303字节,但你的切片逻辑存在字节丢失:
Blob.slice(start, end)是前闭后开区间,即包含start字节,不包含end字节,因此第一个分片slice(0, 4194303)正好是4194303字节。- 但你第二个分片从
4194304开始,跳过了第4194303字节(索引从0开始),每个分片之间都少1字节,最终合并后的文件比原文件少4字节,直接导致文件损坏。
修复方法:
按连续区间计算分片,起始位置等于上一个分片的结束位置:
const chunkSize = 4194303; const blobChild1 = blobParent.slice(0, chunkSize, 'video/mp4'); const blobChild2 = blobParent.slice(chunkSize, chunkSize * 2, 'video/mp4'); const blobChild3 = blobParent.slice(chunkSize * 2, chunkSize * 3, 'video/mp4'); const blobChild4 = blobParent.slice(chunkSize * 3, chunkSize * 4, 'video/mp4'); const blobChild5 = blobParent.slice(chunkSize * 4, buffer.length, 'video/mp4');
或者用循环自动生成分片,避免手动计算出错:
const chunkSize = 4194303; const blobsArray = []; for (let i = 0; i < buffer.length; i += chunkSize) { const end = Math.min(i + chunkSize, buffer.length); blobsArray.push(blobParent.slice(i, end, 'video/mp4')); }
3. 其他次要问题
- 变量重复声明:你先声明了
var blobsArray = [],后面又用const blobsArray = [...],会触发语法错误,删掉前面的var声明即可。 - 不必要的async包裹:
splitVideo是async函数,但内部用了同步的fs.readFileSync,如果要保持异步风格,建议改用异步读取:
const splitVideo = async (filepath) => { const buffer = await fs.promises.readFile(filepath); const blobParent = new Blob([buffer], {type: 'video/mp4'}); const chunkSize = 4194303; const blobsArray = []; for (let i = 0; i < buffer.length; i += chunkSize) { const end = Math.min(i + chunkSize, buffer.length); blobsArray.push(blobParent.slice(i, end, 'video/mp4')); } return blobsArray; };
验证步骤
- 修复代码后,先在本地合并分片,检查合并后的文件大小是否和原文件完全一致(20301174字节)。
- 确认合并后的文件可以正常播放,再重新上传到LinkedIn API。
内容的提问来源于stack exchange,提问作者Brett
相关产品推荐
相关产品推荐

