首页 > 解决方案 > 通过 .net nuget 包 API 将 MS Word docx 文件加载到 Google Drive 时出现问题

问题描述

我们无法理解为什么我们通过 Google Drive API v3 上传 docx 文件,它完成了成功。但是我们上传docx后,我们尝试打开文件并且无法打开它,错误中的错误

在此处输入图像描述

但是当在浏览器(谷歌浏览器)中打开我们的磁盘并尝试再次上传 docx 时,它可以正常打开,没有任何错误。

你能告诉我们做错了什么吗?

代码示例

class Program
{
    // If modifying these scopes, delete your previously saved credentials
    // at ~/.credentials/drive-dotnet-quickstart.json
    static string[] Scopes = { DriveService.Scope.DriveMetadata };
    static string ApplicationName = "Drive API .NET Quickstart";

    static void Main(string[] args)
    {
        UserCredential credential;

        using (var stream =
            new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
        {
            // The file token.json stores the user's access and refresh tokens, and is created
            // automatically when the authorization flow completes for the first time.
            var clientSecrets = new ClientSecrets();
            clientSecrets.ClientId = "";
            clientSecrets.ClientSecret = "";
            string credPath = "token.json";
            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                clientSecrets,
                Scopes,
                "user",
                CancellationToken.None,
                new FileDataStore(credPath, true)).Result;
            Console.WriteLine("Credential file saved to: " + credPath);
        }

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

        Google.Apis.Drive.v3.Data.File fileMetadata = new Google.Apis.Drive.v3.Data.File();
        // fileMetadata.Name = @"excel1.xlsx";
        fileMetadata.Name = @"word22222.docx";
        // fileMetadata.Name = @"present1.pptx";
        // var fileStream = File.Open(@"c:\temp\present.pptx", FileMode.Open);
        string fileId = string.Empty;
        using (var fileStream = File.Open(@"c:\temp\word3.docx", FileMode.Open))
        {
            // var fileStream = File.Open(@"c:\temp\excel1.xlsx", FileMode.Open);
            var fileUpload = service.Files.Create(fileMetadata, fileStream, "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
            // var fileUpload = service.Files.Create(fileMetadata, fileStream, "application/vnd.openxmlformats-officedocument.presentationml.presentation");
            fileUpload.Fields = "id";
            // var fileUpload = service.Files.Create(fileMetadata);
            // fileMetadata.MimeType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
            // var fileUpload = service.Files.Create(fileMetadata, fileStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            IUploadProgress progress = fileUpload.Upload();
            if (progress.Status == UploadStatus.Failed)
            {
                Console.WriteLine(progress.Exception);
            }
            else
            {
                fileId = fileUpload.ResponseBody.Id;
                Console.WriteLine("File ID: " + fileUpload.ResponseBody.Id);
            }
        }
        Console.ReadKey();

        var permission = new Google.Apis.Drive.v3.Data.Permission();
        permission.Type = "anyone";
        permission.Role = "writer";
        permission.PermissionDetails = new List<PermissionDetailsData>();
        var perm = service.Permissions.Create(permission, fileId);
        perm.Execute();

        Console.WriteLine("Premission created!");
        Console.ReadKey();

        Process.Start("explorer.exe", "https://docs.google.com/document/d/" + fileId + "/edit");
        // Process.Start("explorer.exe", "https://docs.google.com/spreadsheets/d/" + fileId + "/edit");
        // Process.Start("explorer.exe", "https://docs.google.com/presentation/d/" + fileId + "/edit");
        Console.WriteLine("Redirected to browser!");
        Console.ReadKey();
    }
}

标签: c#.net-coregoogle-drive-api

解决方案


考虑

根据文档和我的测试,您不能metadata仅创建具有范围的文件。

使用此范围将导致权限错误。请尝试使用更受限制的范围来执行此操作。

Insufficient Permission: Request had insufficient authentication scopes. [403]

解决方案

您可以使用以下之一:

在 C# 中,这转换为以下语句之一:

static string[] Scopes = { DriveService.Scope.Drive };
// OR
static string[] Scopes = { DriveService.Scope.DriveAppdata };
// OR
static string[] Scopes = { DriveService.Scope.DriveFile };

参考

驱动器文件创建


推荐阅读