Unity移动端应用:通过Google Drive V3 API创建文件夹并上传PDF
在Unity中将PDF上传到Google Drive指定文件夹的解决方案
要实现将PDF上传到名为"PDF Files"的指定文件夹,你需要分两步操作:先检查/创建目标文件夹,再修改上传代码指定父文件夹ID。以下是具体实现方案:
步骤1:实现文件夹检查与创建方法
创建一个异步方法,先查询Drive中是否存在目标文件夹,不存在则创建并返回其ID。注意:创建文件夹无需使用multipart格式,直接发送JSON元数据即可,这也是你之前出现400错误的原因之一。
public async Task<string> GetOrCreatePDFFolderAsync() { using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", CloudData.instance.googleAccessToken); // 查询是否存在未被删除的"PDF Files"文件夹 var queryUri = new Uri("https://www.googleapis.com/drive/v3/files?q=name='PDF Files' and mimeType='application/vnd.google-apps.folder' and trashed=false"); var response = await client.GetAsync(queryUri); if (response.IsSuccessStatusCode) { var jsonResult = await response.Content.ReadAsStringAsync(); using (var doc = JsonDocument.Parse(jsonResult)) { var files = doc.RootElement.GetProperty("files"); if (files.GetArrayLength() > 0) { // 返回已存在的文件夹ID return files[0].GetProperty("id").GetString(); } } } // 文件夹不存在,创建新文件夹 var createUri = new Uri("https://www.googleapis.com/drive/v3/files"); var folderMeta = new { name = "PDF Files", mimeType = "application/vnd.google-apps.folder" }; var jsonContent = JsonContent.Create(folderMeta); var createResponse = await client.PostAsync(createUri, jsonContent); createResponse.EnsureSuccessStatusCode(); var createJson = await createResponse.Content.ReadAsStringAsync(); using (var doc = JsonDocument.Parse(createJson)) { return doc.RootElement.GetProperty("id").GetString(); } } }
步骤2:修改原上传方法,指定父文件夹
在原上传代码中,先调用上述方法获取文件夹ID,然后在PDF的元数据中添加parents字段,指定上传到目标文件夹。
public async Task UploadToGoogleDriveAsync() { // 获取或创建目标文件夹ID string folderId = await GetOrCreatePDFFolderAsync(); if (string.IsNullOrEmpty(folderId)) { Debug.LogError("无法获取或创建PDF文件夹"); return; } using (var client = new HttpClient()) { Debug.Log(CloudData.instance.googleAccessToken); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", CloudData.instance.googleAccessToken); var apiUri = new Uri("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"); // 读取PDF二进制内容 var pdfBinaryContent = new ByteArrayContent(LandlordCertLayout.instance.PDFDocumentBytes()); pdfBinaryContent.Headers.Add("Content-Type", "application/pdf"); // 构造元数据,添加parents字段指定父文件夹 var metaData = new { name = LandlordCertLayout.instance.PDFName, parents = new[] { folderId } // 关键:指定上传到该文件夹 }; var metaStream = JsonContent.Create(metaData); metaStream.Headers.Add("Content-Type", "application/json; charset=UTF-8"); // 构建multipart请求内容 var multipartContent = new MultipartFormDataContent("myboundry"); multipartContent.Headers.Remove("Content-Type"); multipartContent.Headers.TryAddWithoutValidation("Content-Type", "multipart/related; boundary=myboundry"); multipartContent.Add(metaStream, "myboundry"); multipartContent.Add(pdfBinaryContent, "myboundry"); HttpResponseMessage result = await client.PostAsync(apiUri, multipartContent); Debug.Log("上传结果: " + result.StatusCode + " - " + await result.Content.ReadAsStringAsync()); } }
关键注意事项
- 权限验证:确保你的Google Drive API授权范围包含
drive.file或drive,否则会出现权限不足错误。 - 错误处理:代码中添加了基础的错误检查,建议在实际项目中补充try-catch块,捕获HTTP请求异常。
- JSON序列化:使用
JsonContent.Create替代手动拼接JSON字符串,避免格式错误导致的400请求。
内容的提问来源于stack exchange,提问作者Jonesy
相关产品推荐
相关产品推荐

