使用 java 中的服务帐户将数据上传到共享驱动器

Uploading data to shared drive using service account in java

我想使用 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(teamdrive 或 shareddrive)设置为上传文件的父级,但我仍然无法在共享驱动器文件夹中查看它。请帮我解决这个问题。

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

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

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

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

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

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

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

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


当您使用服务帐户将文件上传到共享云端硬盘时遇到问题,您应该按照以下步骤进行故障排除:

  • 隔离问题
  • 问问自己 - 问题是与服务帐户的使用有关还是其他?
  • 为此,在没有服务帐户的情况下测试相同的请求
  • 如果服务帐户是罪魁祸首
    • 验证您是否在 GCP 控制台中正确启用了 domain-wide 委派
    • 验证您是否在管理控制台中向委托服务帐户提供了正确的范围
  • 验证您的代码实现是否正确
  • 如果问题与服务帐户无关 - 验证是代码语法相关还是请求相关
  • 为此,使用 Try this API 工具无需编码即可测试您的请求
    • 如果问题与编码有关 - 调试您的代码
    • 如果问题与请求相关,请根据错误采取行动 试试这个 API returns 你
  • 如果您收到 404 File not found 错误 - 这意味着
    • 文件位于共享驱动器上(在这种情况下,您必须如上所述将 supportsAllDrives 设置为 true
    • 或者fileId不正确
    • 或者您用于身份验证的帐户无法访问该文件