使用Google Drive .NET API创建文件的空响应

时间:2017-08-13 15:37:08

标签: asp.net google-drive-api

我正在尝试使用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的其他问题,但都没有任何帮助。

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

4 个答案:

答案 0 :(得分:0)

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

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

  

您可以尝试直接致电rest api以达到您的要求:

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

Upload Files

  

Drive API允许您在create或{}时上传文件数据   updating 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中可能遇到的错误。

答案 1 :(得分:0)

查看request.Upload()返回的内容。对我来说,当我遇到这个问题时,它又回来了:

  

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

我将范围从DriveService.Scope.DriveReadonly更改为DriveService.Scope.Drive,而且我还在营业。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

    string[] Scopes = { DriveService.Scope.Drive };
  • 更改驱动器作用域,然后删除文件token.json
  • 在vs2017中,当存在client_secret.json文件时,您可以在token.json文件夹中看到token.json文件。

click to see token.json