在C#.Net中使用GoogleDriveApi v3添加共享权限并获取上传文件的公共链接



我正在尝试使用GoogleDriveApi v3获得上传文件到GoogleDrive的公共共享链接。我可以上传文件并获得FileId。我无法为上传的文件添加权限和可共享链接。我在互联网和StackOverflow上搜索了很多答案,但没有找到任何能帮助我解决问题的答案。我尝试过为Java和Python提供的解决方案,但我遇到了错误:

Google.GoogleApiException: 'The service drive has thrown an exception. HttpStatusCode is Forbidden. The resource body includes fields which are not directly writable.'

这是我的代码:

public async Task UploadFileAsync(Stream file, string fileName, string fileMime, string folder, string fileDescription)
{
DriveService driveService = GetService();
var fileMetaData = new Google.Apis.Drive.v3.Data.File()
{
Name = filename, Description = fileDescription, MimeType = fileMime, Parents = new string[] { folder },
};
var request = driveService.Files.Create(fileMetaData, file, fileMime);
request.Fields = "id, webContentLink";
var response = await request.UploadAsync(cancellationToken);
if (response.Status != UploadStatus.Completed)
throw response. Exception;
var permission = new Permission { AllowFileDiscovery = true, Id = "id, webContentLink", Type = "anyone", Role = "reader" };
var createRequest = driveService.Permissions.Create(permission, request.ResponseBody.Id);
createRequest.Fields = "id, webContentLink";
await createRequest.ExecuteAsync();
Debug.WriteLine("Link: " + request.ResponseBody.WebContentLink);
}

我正在获取语句request.ResponseBody.WebContentLink中的链接,但没有在该文件上设置权限。因此,文件不共享,链接也不起作用。我做错了什么吗?

纠正Permission初始化后使其工作。似乎Permission.Id不可写(因此出现错误The resource body includes fields which are not directly writable.(。因此,删除了对Permission.Id的某个值的赋值。

因此正确的方法是

var permission = new Permission { AllowFileDiscovery = true, Type = "anyone", Role = "reader" };
var fileId = request.ResponseBody.Id;
await driveService.Permissions.Create(permission, fileId).ExecuteAsync();

因此,通过这种方式,我们可以对上传的文件设置权限,并通过代码使其可共享。其余代码正确。此外,我们将使用request.ResponseBody.WebContentLink获得可下载的链接。

通过google drive web应用程序创建的可共享链接不是您可以通过google drive API创建或获得的。

下载链接中的WebView链接只能由对文件具有权限的人使用

因此,如果你想让用户能够使用链接,你需要添加用户作为文件的读取器

API流上传文件并向用户授予访问权限

通过上传文件的file.Create方法创建一个文件。

然后预创建一个permissions.create,添加您希望能够访问下载文件的用户。

然后执行file.get以获取WebContentLink,用户应该能够通过他们的谷歌驱动器帐户访问该文件。

最新更新