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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:43:26