为什么在使用服务帐户将文件上传到共享的Google云端硬盘文件夹时,为什么会收到200 OK的空响应?

问题描述 投票:0回答:1

我正在尝试使用服务帐户,通过Google Drive API v3和.Net客户端将文件上传到共享的Google Drive文件夹中。服务帐户将添加到文件夹中,并显示“可以组织,添加和编辑”。而且,如果我执行列表请求,我会找回文件夹(因此,我知道服务帐户身份验证有效并且至少可以访问共享文件夹)。

但是,如果我尝试上传文件,则会收到200响应(因此没有错误),但ResponseBody为空。如果我再次列出,则文件不存在。我不知道这是什么意思或原因,也无法在任何地方找到有关此情况的任何信息。

这是我的上传代码。 [PARENT_ID]是共享文件夹的ID,我已经掌握了要上传的CSV文件的内容,并将其转换为字节以放入随后发送的流中。

using (var driveService = new DriveService(new BaseClientService.Initializer()
{
    HttpClientInitializer = googleCredential.CreateScoped(DriveService.Scope.Drive),
    ApplicationName = "FunctionApp"
}))
    {
    File fileMetadata = new File()
    {
        Name = "FileName",
        MimeType = "application/vnd.google-apps.spreadsheet",
        Parents = new List<string>() { "[PARENT_ID]" }
    };

    FilesResource.CreateMediaUpload request;
    using (var csvStream = new MemoryStream())
    {
        csvStream.Write(csvBytes);
        request = driveService.Files.Create(
            fileMetadata, csvStream, "text/csv");
    }
    request.Fields = "id";
    request.Upload();
    var file = request.ResponseBody;
    Console.WriteLine("File ID: " + file.Id);
}

文件变量始终为null,因此显然file.Id抛出NullReferenceException。

我已经盯着这个看了好几个小时,但无法弄清楚出什么问题了。有什么想法吗?

[我尝试将csv字符串保存到文件a,然后在文件流中读取它(更接近https://developers.google.com/drive/api/v3/manage-uploads#import_to_google_docs_types_底部的示例),但这会产生相同的结果。

注意:我已经可以使用https://developers.google.com/drive/api/v3/reference/files/create上的“尝试使用此API”工具在同一个文件夹中创建文件,使用的参数与我在此处传递的元数据相同,但是当然不能使用服务帐户,并且不会将任何实际数据传递到文件。

google-drive-api google-api-dotnet-client
1个回答
0
投票

感谢@JonSkeet提供了GitHub(https://github.com/googleapis/google-api-dotnet-client/issues/1490)上的解决方案

问题是流在上载之前(即using之后)被丢弃。代码更改是完全不使用using

var csvStream = new MemoryStream(csvBytes);
request = driveService.Files.Create(fileMetadata, csvStream, "text/csv");
var result = request.Upload();

这成功完成了预期的上传。

尽管也可能保留了request.Fields,但它也没有使用。

热门问题
推荐问题
最新问题