gpt4 book ai didi

c# - 无法将文件上传到 Google 云端硬盘

转载 作者:太空宇宙 更新时间:2023-11-03 15:54:32 26 4
gpt4 key购买 nike

代码在本地运行,但是当我尝试部署网站并尝试运行它时,它抛出异常:

Message":"An error has occurred.","ExceptionMessage":"Class not registered","ExceptionType":"System.ComponentModel.Win32Exception","StackTrace":" at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task)\r\n at Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker.d__1.MoveNext() in c:\code\google.com\google-api-dotnet-client\default_182\Tools\Google.Apis.Release\bin\Debug\output\default\Src\GoogleApis.Auth.DotNet4\OAuth2\GoogleWebAuthorizationBroker.cs:line 59

代码如下:

UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets
{
ClientId = Settings.ClientId,
ClientSecret = Settings.ClientSecret,
},
new[] { DriveService.Scope.Drive },
"user",
CancellationToken.None,
new FileDataStore("MyStore")).Result;

var service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "AppName",
});


File body = new File();
body.Title = fileName;
body.Description = "Body";
body.MimeType = "text/plain";

String dir = HttpContext.Current.Server.MapPath("~/App_Data");

byte[] byteArray = System.IO.File.ReadAllBytes(fileName);
System.IO.MemoryStream stream = new System.IO.MemoryStream(byteArray);

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

request.Upload();

如有任何帮助,我们将不胜感激。

更新:

我试着把代码改成这样:

var token = new TokenResponse { RefreshToken = "1/0i6iw4nsecXSVn1_OtYZVo7VCs24jKXdji6gVBrz3TM" };
var credential = new UserCredential(new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = Settings.ClientId,
ClientSecret = Settings.ClientSecret
},
Scopes = new[] { DriveService.Scope.Drive },
DataStore = new FileDataStore("MyStore")
}), "user", token);

它不会抛出异常,但文件不会上传。虽然创建了 MyStore 文件夹。我错过了什么吗?我还尝试实现此处发布的代码 http://www.daimto.com/google-oauth2-csharp/但它也不起作用。

最佳答案

首先:

'Class not registered' 向我暗示这是 dll 的问题。检查你的机器和服务器是 GAC 中的 .dll 吗?不,我不确定他们是否需要在 GAC 中,我猜我还没有测试过。我几乎记得我对此有过疑问,但那是不久前的事了。服务器上的 .net 版本怎么样?再次猜测。

第二:

您的代码正在调用 FileDataStore,它将在 %appData% 中查找类似的内容。注意:文件名末尾的-user与您发送的"user"相同。因此,您要告诉它在该目录中查找具有该名称的文件。

%appData%\MyStore\Google.Apis.Auth.OAuth2.Responses.TokenResponse-user

您遇到的问题可能是它是一个网络服务器,该服务器可能无权创建文件,但我不是网络服务器专家,您可能想尝试咨询您的网络服务器管理员。

我个人建议您创建自己的 IDataStore 实现,我宁愿将 refreshTokens 存储在与用户帐户关联的数据库中。如果您决定这样做,您将能够像这样向它提供 refreshToken:

//Now we load our saved refreshToken.
StoredResponse myStoredResponse = new StoredResponse(_RefreshToken);

//现在我们通过 StoredResponse 传递一个 SavedDatastore。

var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets { ClientId = "YourClientId", ClientSecret = "YourClientSecret" },
new[] { DriveService.Scope.Drive,
DriveService.Scope.DriveFile },
"user",
CancellationToken.None,
new SavedDataStore(myStoredResponse)).Result; }

请注意我是如何使用 new SavedDataStore(myStoredResponse) 而不是 new FileDataStore("MyStore") 的。本教程有一个如何创建 SavedDataStore 的示例。此处发布的代码有点长。

请注意,在该教程的底部有一个示例项目运行它。是的,我承认它有点困惑,我应该更新那个示例项目。
第三

我不明白你的更新代码。我认为您无法创建自己的 UserCredentialUserCredential 在获得新的 AccessToken 后由 GoogleWebAuthorizationBroker.AuthorizeAsync 返回。它通过请求用户访问或使用 RefreshToken 为您提供一个新的 AccessToken,它已经为您提供了一个新的。因此,除非您已经手动获得了自己的 AccessToken 或其他东西,否则我看不出这将如何成为您可以使用的有效 UserCredential

第四:

我觉得你要么是受到上面的压力,要么是你看这两个长了。退后一步,你的更新让我觉得你在绝望和捕获救命稻草。如果您仍然无法正常工作,请随时给我发电子邮件。

如果您确实在服务器管理员的帮助下使用 fileDatastore 让它工作,我也很想知道这一点以供将来引用。

关于c# - 无法将文件上传到 Google 云端硬盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24178823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com