调用Microsoft Graph API向OneDrive写入MP4文件时返回BadRequest错误求助
问题原因
你遇到的BadRequest错误核心是提交的SourceDriveItem元数据存在校验不通过的问题,其他类型文件没有附带音视频/照片专属元数据所以能正常创建,视频文件触发了元数据校验规则:
- 你同时为同一个文件提交了
photo和video两个互斥的资源元数据,两类元数据不可同时存在于同一个driveItem上 - 手动传入的
video字段参数存在异常:frameRate字段值为30000.0,远超出正常视频帧率的合理范围(常规视频帧率为24/30/60),不符合Graph API的参数校验规则 - 你当前使用的
AddAsync传入driveItem对象的写法仅用于创建元数据条目,并没有上传实际的视频文件内容,不符合文件上传的接口逻辑
解决方案
按照以下步骤调整即可解决问题:
- 首先删除
SourceDriveItem里手动添加的photo字段和整个video字段,OneDrive在你上传完视频内容后会自动提取所有音视频元数据,不需要手动传入,避免参数校验失败 - 根据文件大小选择对应的上传方式:
- 文件小于4MB时,直接传入文件流上传:
using var fileStream = new FileStream("本地视频文件路径.mp4", FileMode.Open); var driveItem = await graphClient.Users[UserEmailID].Drive.Items[Item.ParentItemID].Children["file_example_MP4_480_1_5MG.mp4"].Content.Request().PutAsync<DriveItem>(fileStream);- 文件大于4MB需要分块上传时,先创建上传会话再分块传输:
// 先创建上传会话 var uploadSession = await graphClient.Users[UserEmailID].Drive.Items[Item.ParentItemID].ItemWithPath("file_example_MP4_480_1_5MG.mp4").CreateUploadSession().Request().PostAsync(); // 设置分块大小,推荐为320KB的倍数 int chunkSize = 320 * 1024; var largeFileUploadTask = new LargeFileUploadTask<DriveItem>(uploadSession, fileStream, chunkSize); // 执行分块上传 var uploadResult = await largeFileUploadTask.UploadAsync(); if(uploadResult.UploadSucceeded) { // 上传完成,获取上传后的driveItem var uploadedItem = uploadResult.ItemResponse; } - 若确实需要自定义元数据,可在文件上传完成后,单独调用更新接口修改driveItem属性即可,不要在创建文件时同时传入冲突的元数据字段
- 额外提示:不要用
.Result同步等待异步方法,容易触发线程死锁,建议统一使用await异步调用
内容的提问来源于stack exchange,提问作者Daksh Padiya
相关产品推荐
相关产品推荐

