c# - 通过 .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();
}
}
解决方案
考虑
根据文档和我的测试,您不能metadata
仅创建具有范围的文件。
使用此范围将导致权限错误。请尝试使用更受限制的范围来执行此操作。
Insufficient Permission: Request had insufficient authentication scopes. [403]
解决方案
您可以使用以下之一:
- https://www.googleapis.com/auth/drive
- https://www.googleapis.com/auth/drive.file
- https://www.googleapis.com/auth/drive.appdata
在 C# 中,这转换为以下语句之一:
static string[] Scopes = { DriveService.Scope.Drive };
// OR
static string[] Scopes = { DriveService.Scope.DriveAppdata };
// OR
static string[] Scopes = { DriveService.Scope.DriveFile };
参考
推荐阅读
- ios - IOS 电子邮件应用程序中未显示 base64 图像
- c# - 我可以传递 IAwaitable 的值吗
- javascript - 为本地覆盖选择具有相同路径的域中的第二页
- c# - 如何在c#中修复此错误“无法将类型'char'隐式转换为'string'”?
- spring - 弹簧初始化挂起几分钟
- r - 如何在quanteda中计算每天的单词比例?
- r - 在 R 中结合线图和头图图
- django - 如何在 django 中使用 django-taggit 按标签过滤帖子
- sass - @import compass 到 scss 文件的问题
- git - 为什么'git rev-list --left-right'比较A..B与B..A不一致?