不使用Google Drive Nuget,调用Google Drive API多部件上传文件失败求助
不使用Google Drive Nuget上传文件到Drive API v3的正确实现
你的核心问题在于错误使用了multipart类型,以及手动拼接请求体时的格式错误。Google Drive的multipart上传要求使用multipart/related类型,而非表单上传的multipart/form-data,同时手动拼接请求体极易出现换行、边界格式等细节错误。以下是正确的实现方式:
关键错误分析
- 第一个手动拼接请求体的代码:
- 错误地将字符串
"{}"序列化后作为media内容,实际应直接传递文件原始内容 - 手动拼接multipart内容容易出现换行符、边界格式不匹配的问题,导致服务器解析失败
- 错误地将字符串
- 第二个使用
MultipartFormDataContent的代码:- Drive API的multipart上传不支持表单类型的
multipart/form-data,必须使用multipart/related
- Drive API的multipart上传不支持表单类型的
正确代码实现
示例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
相关产品推荐
相关产品推荐

