使用C#上传的Google驱动API

使用C#上传的Google驱动API,c#,asp.net,google-api,google-drive-api,google-api-dotnet-client,C#,Asp.net,Google Api,Google Drive Api,Google Api Dotnet Client,我正在尝试使用asp.net应用程序中的Google Drive API上载文件 问题:代码在本地工作,但当上传到服务器时,什么也没有发生(页面只是一直在加载…没有显示同意屏幕。已通知帮助)。 “UploadedPdf”文件夹是可写的,并且client_secrets.json存在于该文件夹中 注意:我没有在服务器上安装任何东西,只是将所有包含Google API dll的文件上传到服务器的bin文件夹中 UserCredential credential; using (var

我正在尝试使用asp.net应用程序中的Google Drive API上载文件

问题:代码在本地工作,但当上传到服务器时,什么也没有发生(页面只是一直在加载…没有显示同意屏幕。已通知帮助)。 “UploadedPdf”文件夹是可写的,并且client_secrets.json存在于该文件夹中

注意:我没有在服务器上安装任何东西,只是将所有包含Google API dll的文件上传到服务器的bin文件夹中

UserCredential credential;
        using (var filestream = new FileStream(Server.MapPath("UploadedPdf/client_secrets.json"),
            FileMode.Open, FileAccess.Read))
        {
            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(filestream).Secrets,
                new[] { DriveService.Scope.Drive },
                "user",
                CancellationToken.None,
                new FileDataStore(Server.MapPath("UploadedPdf/"))).Result;
        }

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

        Google.Apis.Drive.v2.Data.File body = new Google.Apis.Drive.v2.Data.File();
        body.Title = "My document";
        body.Description = "A test document";
        body.MimeType = "text/plain";

        byte[] byteArray = System.IO.File.ReadAllBytes(Server.MapPath("UploadedPdf/sample.txt"));
        System.IO.MemoryStream stream = new System.IO.MemoryStream(byteArray);

        FilesResource.InsertMediaUpload request = service.Files.Insert(body, stream, "text/plain");
        request.Upload();

        Google.Apis.Drive.v2.Data.File file = request.ResponseBody;

我认为您调用AuthorizeAsync()时出错。请使用wait关键字并远程调用.Result。您必须将该方法标记为async才能执行此操作

我还建议改为使用UploadAsync()方法。您也不需要使用ReadAllBytes()将整个文件加载到内存中。只需使用file.OpenRead()并传递文件流而不是MemoryStream

谷歌有一些示例代码:
文件数据存储默认情况下将文件放在%appData%中。通常我会这样做。(假设我也使用“用户”)

然后当我调用它时,我得到一个名为

%AppData%\Roaming\Console.Analytics.Auth.Store
在该目录中,现在有一个名为

Google.Apis.Auth.OAuth2.Responses.TokenResponse-user
我还没有测试过你在做什么

new FileDataStore(Server.MapPath("UploadedPdf/"))
可以,但我猜你会得到一个名为

%AppData%\Roaming\serverpat/uploadpdf/
我不认为这是你想要的。如果你真的想这样做,你已经使目录可写了?你可能想改为使用

我不确定这是否是你的问题


还请记住,您正在硬编码“用户”,因此从技术上讲,您的代码将要求您为“用户”进行一次身份验证,然后在该文件中为“用户”进行身份验证,因此没有理由再次要求验证。

您的代码表明您正在使用“已安装的应用程序”工作流/凭据,如果您在本地运行ASP.NET应用程序,它应该可以正常工作。但是,当您将相同的代码移动到web服务器时,它不再是已安装的应用程序。它进入“web应用程序”类别

您需要转到谷歌开发者控制台->凭据->创建新的客户端ID并为您的web应用程序生成一组新的凭据。此外,您还需要根据以下指南更改OAuth流:

步骤包括

1)Access to the internet and a web browser, in order to authorize the sample   app.
2)A Google account with Drive enabled.
3)An environment to run programs in your selected language.
试试这个

https://developers.google.com/drive/v2/reference/files/insert#examples

你在Google开发者控制台中添加了重定向uri到服务器了吗?是的,我添加了重定向url.goto浏览器控制台任何错误请更新?检查你是否有在服务器中保存文件的完全权限我真的很生气Google怎么不能让这个API正常工作。它很容易出错,很难学习,简单来说很复杂操作。我想使用云存储作为我的blob存储(DMS),在这种情况下真的很糟糕。只需在谷歌上搜索一下,你就会发现几十个问题,人们都在不同程度上使用驱动器的API。然后尝试上面链接中提供的身份验证方法,而不是你之前尝试的方法,并分享结果。另一个缺陷可能是DalmTo指出的。你可能想X连接存储接口以实现您自己的接口。参考:
https://developers.google.com/drive/v2/reference/files/insert#examples