如何拆分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
相关产品推荐
相关产品推荐

