【问题标题】:Null response creating file using Google Drive .NET API使用 Google Drive .NET API 创建文件的空响应
【发布时间】:2017-08-13 15:37:08
【问题描述】:

我正在尝试使用 Google Drive .NET API v3 将文件上传到我的云端硬盘。我的代码在下面

static string[] Scopes = { DriveService.Scope.Drive,
                       DriveService.Scope.DriveAppdata,
                       DriveService.Scope.DriveFile,
                       DriveService.Scope.DriveMetadataReadonly,
                       DriveService.Scope.DriveReadonly,
                       DriveService.Scope.DriveScripts };
    static string ApplicationName = "Drive API .NET Quickstart";

    public ActionResult Index()
    {
        UserCredential credential;

        using (var stream =
            new FileStream("C:/Users/admin1/Documents/visual studio 2017/Projects/TryGoogleDrive/TryGoogleDrive/client_secret.json", FileMode.Open, FileAccess.Read))
        {
            string credPath = Environment.GetFolderPath(
                System.Environment.SpecialFolder.Personal);
            credPath = Path.Combine(credPath, ".credentials/drive-dotnet-quickstart.json");

            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                Scopes,
                "user",
                CancellationToken.None,
                new FileDataStore(credPath, true)).Result;
            Debug.WriteLine("Credential file saved to: " + credPath);
        }

        // Create Drive API service.
        var service = new DriveService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = ApplicationName,
        });

        // Define parameters of request.
        FilesResource.ListRequest listRequest = service.Files.List();
        listRequest.PageSize = 10;
        listRequest.Fields = "nextPageToken, files(id, name)";

        // List files.
        IList<Google.Apis.Drive.v3.Data.File> files = listRequest.Execute()
            .Files;
        Debug.WriteLine("Files:");
        if (files != null && files.Count > 0)
        {
            foreach (var file in files)
            {
                Debug.WriteLine("{0} ({1})", file.Name, file.Id);
            }
        }
        else
        {
            Debug.WriteLine("No files found.");
        }

        var fileMetadata = new Google.Apis.Drive.v3.Data.File()
        {
            Name = "report.csv",
            MimeType = "text/csv",
        };
        FilesResource.CreateMediaUpload request;
        using (var stream = new FileStream("C:/debugging/report.csv",
                                FileMode.Open))
        {
            request = service.Files.Create(
                fileMetadata, stream, "text/csv");
            request.Fields = "id";
            request.Upload();
        }
        var response = request.ResponseBody;
        Console.WriteLine("File ID: " + response.Id);

        return View();        
    }

我面临的问题是响应始终为空。我进一步查看了一下,发现请求返回了 403 resultCode。我还查看了关于 SO thisthis 的其他一些问题,但都没有任何帮助。

编辑:我忘了提到代码的第一部分工作正常 - 它列出了我云端硬盘中的所有文件。只有第二部分不起作用(上传文件部分)

【问题讨论】:

    标签: asp.net google-drive-api


    【解决方案1】:
        string[] Scopes = { DriveService.Scope.Drive };
    
    • 更改 Drive 范围,然后删除文件 token.json
    • 在 vs2017 中,当 client_secret.json 文件存在时,您可以在 token.json 文件夹中看到 token.json 文件。

    【讨论】:

      【解决方案2】:

      尝试从 ASP.NET 论坛访问this post

      与您想在应用中执行的操作相同,因为您正在处理使用 .net 在 Google Drive 中上传文件。

      您可以尝试直接调用rest api来实现您的要求:

      The quickstart from .net 将帮助您向 Drive API 发出请求。

      Upload Files:

      Drive API 允许您在createupdating File 资源。

      您可以通过以下任一方式发送上传请求:

      • 简单上传:uploadType=media。用于快速传输小文件(5 MB 或更少)。要执行简单的上传,请参阅Performing a Simple Upload.
      • 分段上传:uploadType=multipart。为了快速传输小文件(5 MB 或更少)和描述文件的元数据,所有这些都在一个 单个请求。要执行分段上传,请参阅Performing a Multipart Upload
      • 可恢复上传:uploadType=resumable。对于更可靠的传输,对于大文件尤其重要。可恢复上传是 对于大多数应用来说是一个不错的选择,因为它们也适用于小型 以每次上传一个额外的 HTTP 请求为代价的文件。到 执行可恢复上传,请参阅Performing a Resumable Upload

      您可以在上传示例文件时尝试documentation 中的此代码。

      var fileMetadata = new File()
      {
          Name = "photo.jpg"
      };
      FilesResource.CreateMediaUpload request;
      using (var stream = new System.IO.FileStream("files/photo.jpg",
                              System.IO.FileMode.Open))
      {
          request = driveService.Files.Create(
              fileMetadata, stream, "image/jpeg");
          request.Fields = "id";
          request.Upload();
      }
      var file = request.ResponseBody;
      Console.WriteLine("File ID: " + file.Id);
      

      您可以查看此documentation 中可能遇到的错误。

      【讨论】:

        【解决方案3】:

        看看request.Upload() 返回什么。对我来说,当我遇到这个问题时它返回了:

        权限不足错误[消息[权限不足]位置[-]

        我将我的范围从 DriveService.Scope.DriveReadonly 更改为 DriveService.Scope.Drive 并且我在做生意。

        【讨论】:

          【解决方案4】:

          static string[] Scopes = { DriveService.Scope.DriveReadonly }; 更改为static string[] Scopes = { DriveService.Scope.Drive };

          更改后,查看token.json 文件并检查它是否将其范围从DriveReadonly 更改为Drive

          如果您看到DriveReadonly,请删除token.json 文件并再次运行应用程序。

          【讨论】:

            猜你喜欢
            • 2022-10-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-26
            • 2016-12-06
            • 1970-01-01
            相关资源
            最近更新 更多