使用C#的Google Drive API - 正在上传

时间:2015-07-01 16:02:06

标签: c# asp.net google-api google-drive-api google-api-dotnet-client

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

问题:代码在本地工作,但上传到服务器时没有任何反应(页面只是继续加载...没有同意屏幕显示。帮助appreaciated。 “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;

4 个答案:

答案 0 :(得分:2)

FileDatastore默认将文件放在%appData%中。通常我会做类似的事情。 (假设我使用"用户"以及)

undefined

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

的目录
new FileDataStore("Console.Analytics.Auth.Store")  
该目录中的

现在存在一个名为

的文件
%AppData%\Roaming\Console.Analytics.Auth.Store

我还没有测试过做什么

Google.Apis.Auth.OAuth2.Responses.TokenResponse-user

会做,但我的猜测是你要得到一个名为

的目录
new FileDataStore(Server.MapPath("UploadedPdf/"))

我不认为你是在追求什么。如果这实际上是你想要做的那样你已经使该目录可写?您可能希望改为使用LocalFileDataStore

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

还记得你是硬编码"用户"所以从技术上讲,你的代码会要求你为" user"进行一次身份验证。之后,它在该文件中对" user"进行了身份验证。所以没有理由再次要求它。

答案 1 :(得分:0)

我认为你正在调用AuthorizeAsync()错误。使用await关键字并远程使用.Result。为了做到这一点,你必须将方法标记为异步。

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

Google有一些示例代码: https://developers.google.com/api-client-library/dotnet/guide/media_upload

答案 2 :(得分:0)

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

您需要转到 Google Developer Console->凭据 - >创建新客户ID ,并为您的网络应用生成一组新的凭据。您还需要根据本指南更改OAuth流程:

https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth#web-applications-aspnet-mvc

答案 3 :(得分:0)

步骤包括

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