我正在尝试使用Google Drive .NET API v3将文件上传到我的云端硬盘。我的代码在
之下static string[] Scopes = { DriveService.Scope.Drive,
DriveService.Scope.DriveAppdata,
DriveService.Scope.DriveFile,
DriveService.Scope.DriveMetadataReadonly,
DriveService.Scope.DriveReadonly,
DriveService.Scope.DriveScripts };
static string ApplicationName = "Drive API .NET Quickstart";
public ActionResult Index()
{
UserCredential credential;
using (var stream =
new FileStream("C:/Users/admin1/Documents/visual studio 2017/Projects/TryGoogleDrive/TryGoogleDrive/client_secret.json", FileMode.Open, FileAccess.Read))
{
string credPath = Environment.GetFolderPath(
System.Environment.SpecialFolder.Personal);
credPath = Path.Combine(credPath, ".credentials/drive-dotnet-quickstart.json");
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
Scopes,
"user",
CancellationToken.None,
new FileDataStore(credPath, true)).Result;
Debug.WriteLine("Credential file saved to: " + credPath);
}
// Create Drive API service.
var service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = ApplicationName,
});
// Define parameters of request.
FilesResource.ListRequest listRequest = service.Files.List();
listRequest.PageSize = 10;
listRequest.Fields = "nextPageToken, files(id, name)";
// List files.
IList<Google.Apis.Drive.v3.Data.File> files = listRequest.Execute()
.Files;
Debug.WriteLine("Files:");
if (files != null && files.Count > 0)
{
foreach (var file in files)
{
Debug.WriteLine("{0} ({1})", file.Name, file.Id);
}
}
else
{
Debug.WriteLine("No files found.");
}
var fileMetadata = new Google.Apis.Drive.v3.Data.File()
{
Name = "report.csv",
MimeType = "text/csv",
};
FilesResource.CreateMediaUpload request;
using (var stream = new FileStream("C:/debugging/report.csv",
FileMode.Open))
{
request = service.Files.Create(
fileMetadata, stream, "text/csv");
request.Fields = "id";
request.Upload();
}
var response = request.ResponseBody;
Console.WriteLine("File ID: " + response.Id);
return View();
}
我面临的问题是响应始终为空。我进一步研究了一下,发现请求返回了403 resultCode。我还看了一些关于SO this和this的其他问题,但都没有任何帮助。
编辑:我忘了提及代码的第一部分工作正常 - 它列出了我的驱动器中的所有文件。只有第二部分不起作用(上传文件部分)
答案 0 :(得分:0)
尝试从ASP.NET论坛访问this post。
与您要在应用中执行的操作相同的想法,因为您正在处理使用.net在Google云端硬盘中上传文件。
您可以尝试直接致电rest api以达到您的要求:
The quickstart from .net可以帮助您向Drive API发出请求。
Drive API允许您在create或{}时上传文件数据 updating File资源。
您可以通过以下任何方式发送上传请求:
- 简单上传:
uploadType=media
。用于快速传输小文件(5 MB或更少)。要执行简单上传,请参阅Performing a Simple Upload.- 分段上传:
uploadType=multipart
。为了快速传输一个小文件(5 MB或更少)和描述该文件的元数据,所有文件都在 单一请求。要执行分段上传,请参阅Performing a Multipart Upload。- 可恢复上传:
uploadType=resumable
。为了更可靠的传输,对于大文件尤为重要。可恢复的上传是 对于大多数应用程序来说,它是一个不错的选择 文件,每次上传一个额外的HTTP请求。至 执行可恢复的上传,请参阅Performing a Resumable Upload。
您可以在上传示例文件的documentation中尝试此代码。
var fileMetadata = new File()
{
Name = "photo.jpg"
};
FilesResource.CreateMediaUpload request;
using (var stream = new System.IO.FileStream("files/photo.jpg",
System.IO.FileMode.Open))
{
request = driveService.Files.Create(
fileMetadata, stream, "image/jpeg");
request.Fields = "id";
request.Upload();
}
var file = request.ResponseBody;
Console.WriteLine("File ID: " + file.Id);
您可以查看此documentation中可能遇到的错误。
答案 1 :(得分:0)
查看request.Upload()
返回的内容。对我来说,当我遇到这个问题时,它又回来了:
权限错误不足[消息[权限不足]位置[ - ]
我将范围从DriveService.Scope.DriveReadonly
更改为DriveService.Scope.Drive
,而且我还在营业。
答案 2 :(得分:0)
将static string[] Scopes = { DriveService.Scope.DriveReadonly };
更改为static string[] Scopes = { DriveService.Scope.Drive };
。
更改后,查看token.json
文件并检查其范围是否从DriveReadonly
更改为Drive
。
如果看到DriveReadonly
,请删除token.json
文件,然后再次运行该应用程序。
答案 3 :(得分:0)