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

如何拆分HTTP请求体?Google Drive多部分上传实现求助

解决Google Drive多部分上传的HttpClient实现问题

你的代码核心问题是没有正确构建multipart/related类型的请求体——只添加了元数据部分,遗漏了文件流内容,同时错误地给单个StringContent设置了multipart类型。下面是修正后的实现:

修正后的代码

async Task UploadFile(StorageFile fileName) // 避免用async void,改用async Task
{
    using (HttpClient client = new HttpClient())
    {
        // 读取文件并创建流内容
        var resultStream = await fileName.OpenReadAsync();
        var fileStreamContent = new StreamContent(resultStream.AsStream());
        // 设置文件内容的MIME类型为文件实际类型
        fileStreamContent.Headers.ContentType = new MediaTypeHeaderValue(fileName.ContentType);

        // 序列化文件元数据(注意字段名是mimeType,不是mimetype)
        var fileMetaData = JsonConvert.SerializeObject(
                            new { name = fileName.Name, mimeType = fileName.ContentType });
        var metaContent = new StringContent(fileMetaData, Encoding.UTF8, "application/json");

        // 创建multipart/related容器,组合元数据和文件内容
        var multipartContent = new MultipartContent("related");
        multipartContent.Add(metaContent);
        multipartContent.Add(fileStreamContent);

        // 构建请求
        var requestMessage = new HttpRequestMessage(HttpMethod.Post, "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart");
        requestMessage.Headers.Authorization = new AuthenticationHeaderValue(tokenType, accessToken);
        requestMessage.Content = multipartContent; // 将组合后的multipart内容作为请求体

        var response = await client.SendAsync(requestMessage);
        response.EnsureSuccessStatusCode(); // 调试阶段可启用,快速捕获请求错误
        string responseString = await response.Content.ReadAsStringAsync();
        output(responseString);
    }
}

关键注意事项

  • 不要用async void:除了UI事件处理器,异步方法都应该返回Task/Task<T>,这样能正常捕获异常、跟踪执行状态
  • 元数字段名要正确:Google Drive API要求元数据中的类型字段是mimeType(驼峰格式),原代码中的mimetype会导致API无法识别文件类型
  • 各部分ContentType要对应:元数据部分设为application/json,文件部分设为文件本身的MIME类型(比如图片用image/png,文档用application/pdf)
  • 启用EnsureSuccessStatusCode:调试阶段加上这行代码,能在请求返回4xx/5xx状态码时直接抛出异常,方便快速定位问题(比如权限不足、端点错误等)

内容的提问来源于stack exchange,提问作者Martin King

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:25:28