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

不使用Google Drive Nuget,调用Google Drive API多部件上传文件失败求助

不使用Google Drive Nuget上传文件到Drive API v3的正确实现

你的核心问题在于错误使用了multipart类型,以及手动拼接请求体时的格式错误。Google Drive的multipart上传要求使用multipart/related类型,而非表单上传的multipart/form-data,同时手动拼接请求体极易出现换行、边界格式等细节错误。以下是正确的实现方式:

关键错误分析

  1. 第一个手动拼接请求体的代码:
    • 错误地将字符串"{}"序列化后作为media内容,实际应直接传递文件原始内容
    • 手动拼接multipart内容容易出现换行符、边界格式不匹配的问题,导致服务器解析失败
  2. 第二个使用MultipartFormDataContent的代码:
    • Drive API的multipart上传不支持表单类型的multipart/form-data,必须使用multipart/related

正确代码实现

示例1:上传字符串内容(如JSON文本)

using System.Net.Http.Headers;
using System.Text.Json;

var uploadUrl = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart";
var accessToken = "your-valid-access-token";
var fileName = "test-file.json";
var parentFolderId = "your-folder-id"; // 可选,不填则上传到根目录
var mediaContentString = "{\"Data\":\"AAA\"}";

// 1. 构造文件元数据(符合Drive API要求)
var fileMetadata = new
{
    name = fileName,
    parents = parentFolderId != null ? new[] { parentFolderId } : null,
    mimeType = "application/json" // 对应文件的MIME类型
};
var metadataContent = new StringContent(
    JsonSerializer.Serialize(fileMetadata),
    Encoding.UTF8,
    "application/json"
);

// 2. 构造媒体内容(文件实际内容)
var mediaContent = new StringContent(
    mediaContentString,
    Encoding.UTF8,
    "application/json"
);

// 3. 创建multipart/related请求体(核心:必须用MultipartContent而非MultipartFormDataContent)
using var multipartContent = new MultipartContent("related");
multipartContent.Add(metadataContent);
multipartContent.Add(mediaContent);

// 4. 发送请求
var request = new HttpRequestMessage(HttpMethod.Post, uploadUrl)
{
    Content = multipartContent
};
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

using var httpClient = new HttpClient();
var response = await httpClient.SendAsync(request);
response.EnsureSuccessStatusCode(); // 抛出异常如果请求失败

// 解析返回的文件信息
var responseJson = await response.Content.ReadAsStringAsync();
var uploadedFile = JsonSerializer.Deserialize<dynamic>(responseJson);
Console.WriteLine($"上传成功,文件ID:{uploadedFile.id}");

示例2:上传本地文件

using System.Net.Http.Headers;
using System.Text.Json;

var uploadUrl = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart";
var accessToken = "your-valid-access-token";
var filePath = @"C:\path\to\your\file.jpg";
var parentFolderId = "your-folder-id";

// 1. 构造文件元数据
var fileMetadata = new
{
    name = Path.GetFileName(filePath),
    parents = parentFolderId != null ? new[] { parentFolderId } : null,
    mimeType = "image/jpeg" // 根据文件类型调整MIME
};
var metadataContent = new StringContent(
    JsonSerializer.Serialize(fileMetadata),
    Encoding.UTF8,
    "application/json"
);

// 2. 读取本地文件作为媒体内容
var fileBytes = await File.ReadAllBytesAsync(filePath);
var mediaContent = new ByteArrayContent(fileBytes);
mediaContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");

// 3. 创建multipart/related请求体
using var multipartContent = new MultipartContent("related");
multipartContent.Add(metadataContent);
multipartContent.Add(mediaContent);

// 4. 发送请求
var request = new HttpRequestMessage(HttpMethod.Post, uploadUrl)
{
    Content = multipartContent
};
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

using var httpClient = new HttpClient();
var response = await httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();

var responseJson = await response.Content.ReadAsStringAsync();
var uploadedFile = JsonSerializer.Deserialize<dynamic>(responseJson);
Console.WriteLine($"上传成功,文件ID:{uploadedFile.id}");

重要注意事项

  • 必须使用MultipartContent("related"):Drive API的multipart上传仅支持multipart/related类型,这是一种用于关联元数据和媒体内容的multipart格式,和表单上传的multipart/form-data完全不同
  • 元数据格式要正确:name是必填字段,parents是可选的文件夹ID数组,mimeType必须和媒体内容的类型一致
  • Access Token权限:确保你的token拥有https://www.googleapis.com/auth/drive.file或更高的Drive访问权限
  • 避免手动拼接multipart内容:使用MultipartContent类可以自动处理边界字符串、换行符等细节,彻底避免格式解析错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:45:16