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

调用Microsoft Graph API向OneDrive写入MP4文件时返回BadRequest错误求助

问题原因

你遇到的BadRequest错误核心是提交的SourceDriveItem元数据存在校验不通过的问题,其他类型文件没有附带音视频/照片专属元数据所以能正常创建,视频文件触发了元数据校验规则:

  1. 你同时为同一个文件提交了photo和video两个互斥的资源元数据,两类元数据不可同时存在于同一个driveItem上
  2. 手动传入的video字段参数存在异常:frameRate字段值为30000.0,远超出正常视频帧率的合理范围(常规视频帧率为24/30/60),不符合Graph API的参数校验规则
  3. 你当前使用的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:24:01