【问题标题】:Uploading data to shared drive using service account in java使用java中的服务帐户将数据上传到共享驱动器
【发布时间】:2020-08-10 10:59:07
【问题描述】:

我想使用 java 将文件上传到共享驱动器。 我创建了一个服务帐户,并与服务帐户的地址共享了共享驱动器(名称为 DB-Drive)。

全局变量

private static HttpTransport httpTransport;
private static Drive drive;

主函数(初始化和列出文件)

    httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    Credential credential = authorize();
    drive = new Drive.Builder(httpTransport, JacksonFactory.getDefaultInstance(), credential).setApplicationName(
                    "Quickstart").build();

    uploadFile();

    FileList result = drive.files().list().execute();
    List<File> files = result.getFiles();
    if (result == null || result.isEmpty()) {
        System.out.println("No files found.");
      } else {
        System.out.println("Files:");
        for (File file : files) {
             System.out.printf("%s %s \n", file.getName(),file.getId());
                }
            }
        } 

授权码

        GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("resources/credentials.json"))
                .createScoped(Collections.singleton(DriveScopes.DRIVE_FILE));

        return credential;

上传代码

 String folderId = "***DB-Drive id****";
        File fileMetadata = new File();
        fileMetadata.setName("photo.jpg");
        fileMetadata.setParents(Collections.singletonList(folderId));
        java.io.File filePath = new java.io.File("/home/*****/Downloads/qck_1552369371.jpeg");
        FileContent mediaContent = new FileContent("image/jpeg", filePath);
        File file = drive.files().create(fileMetadata, mediaContent)
                .setFields("id, parents")
                .execute();
        System.out.println("File ID: " + file.getId());
        return file;

我正在将作为团队驱动器或共享驱动器的 DB-Drive 设置为上传文件的父级,但我仍然无法在共享驱动器文件夹中查看它。请帮我解决这个问题。

我正在添加完整的流程:-

1.) 我使用https://developers.google.com/identity/protocols/oauth2/service-account 中提到的步骤创建服务帐户 我选择了项目并给出了描述和所有内容。

2.) 我没有将域级别委派给服务帐户,而是将数据库驱动器(团队驱动器)与服务帐户地址共享(在 credentials.json 文件中作为 client_email *****.gserviceaccount 提到.com)

3.) 然后我使用上面的代码上传文件,要求服务帐户通过将 DB-Drive 的 id 指定为文件的父 id 将文件上传到共享驱动器,即 DB-Drive。

4.) 但文件仍在上传到服务帐户的驱动器,它没有链接到共享驱动器。

5.) DB-Drive 是父文件夹(唯一的文件夹)。

任何线索都会有很大帮助。

【问题讨论】:

  • 查看您的完整代码,包括将服务帐户创建代码与您的代码合并会有所帮助,尤其是 drive 的定义。
  • 我希望现在一切都清楚了@ziganotschka。
  • 我相信你的错误来自于你没有定义supportsAllDrives=true。请通过Try this API 在没有服务帐户的情况下对其进行测试。
  • Java 客户端具有用于 file.create 功能的 setSupportsTeamDrives 选项。我没有找到这个属性supportsAllDrives。
  • 请看here

标签: java file-upload google-drive-api service-accounts google-drive-shared-drive


【解决方案1】:

正如@ziganotschka 指出的,如果在共享驱动器中创建文件,您需要将supportsAllDrives 设置为true。 Java 客户端的setSupportsTeamDrives 选项已弃用。而是使用setSupportsAllDrives 为真。


当您无法将具有服务帐号的文件上传到共享云端硬盘时,您应该采取以下步骤进行故障排除:

  • 隔离问题
  • 问问自己 - 问题与服务帐户的使用有关还是其他原因?
  • 为此,在没有服务帐户的情况下测试相同的请求
  • 如果服务帐户被证明是罪魁祸首
    • 验证您是否在 GCP 控制台中正确启用了域范围的委派
    • 确认您在管理控制台中为委派的服务帐号提供了正确的范围
  • 验证您的代码实现是否正确
  • 如果问题与服务帐户无关 - 验证是代码语法相关还是请求相关
  • 为此,使用Try this API 工具无需编码即可测试您的请求
    • 如果问题与编码有关 - 调试您的代码
    • 如果问题与请求相关,请根据Try this API返回给您的错误处理
  • 如果您收到 404 File not found 错误 - 它要么意味着
    • 文件位于共享云端硬盘上(在这种情况下,您必须将supportsAllDrives 设置为true,如上所述)
    • 或者fileId不正确
    • 或者您用于身份验证的帐户无法访问该文件

【讨论】:

  • 这个选项不可用 setSupportsAllDrives,只有这个可用 setSupportsTeamDrives.. 我正在使用 compile 'com.google.api-client:google-api-client:1.23.0' compile 'com. google.oauth-client:google-oauth-client-jetty:1.23.0' 编译 'com.google.apis:google-api-services-drive:v3-rev110-1.23.0'
  • 和@Aerials @ziganotschka 当我尝试使用/*.setTeamDriveId("shared drive id") .setCorpora("drive") .setSupportsTeamDrives(true) .setIncludeTeamDriveItems(true)*/列出内容时,我得到了找不到共享驱动器的错误
  • @ArpitPruthi 你想使用 deprecated 方法:supportsTeamDrives。如果谷歌弃用它,那么它不会为你服务。请阅读可选参数“supportsTeamDrives”here 的说明。这意味着您可能需要将客户端升级到最新版本。
  • 我尝试更新 java 客户端并获得了 supportAllDrives 但仍然没有运气,它无法将数据上传到共享驱动器.. 我手动创建了这个共享驱动器并将服务帐户添加为内容管理器到该驱动器(如果这导致任何问题)。
  • 总结一下: 1. 您只需要使用.setIncludeTeamDriveItems(true),而不是.setIncludeTeamDriveItems(true)。 2. 如果您收到未找到驱动器的错误 - 这意味着您提供的 ID 不正确或您没有正确与服务帐户共享驱动器。我建议您再使用Try this API 进行测试 - 这可以帮助您验证驱动器 ID 和其他选项是否设置正确并缩小错误来源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
相关资源
最近更新 更多