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

使用java中的服务帐户将数据上载到共享驱动器,java,file-upload,google-drive-api,service-accounts,google-drive-shared-drive,Java,File Upload,Google Drive Api,Service Accounts,Google Drive Shared Drive,我想用java将文件上传到共享驱动器。 我已创建了一个服务帐户,并已将共享驱动器(名称为DB drive)与服务帐户的地址共享 全局变量 private static HttpTransport httpTransport; private static Drive drive; 主功能(初始化和列出文件) 上传代码 String folderId = "***DB-Drive id****"; File fileMetadata = new File()

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

全局变量

private static HttpTransport httpTransport;
private static Drive drive;
主功能(初始化和列出文件)

上传代码

 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驱动器(teamdrive或shareddrive)设置为上载文件的父级,但仍然无法在共享驱动器文件夹中查看此文件。。请帮我做这个

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

1.)我使用中提到的步骤创建服务帐户 我选择了这个项目,并给出了描述和一切

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

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

4.)但文件仍会上载到服务帐户的驱动器,而不会链接到共享驱动器

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


任何潜在客户都会有很大帮助。

正如@ziganotschka所指出的,如果在共享驱动器中创建文件,您需要将
supportsAllDrives
设置为true。Java客户端的
setSupportSteamDrive
选项已被弃用。相反,使用“真实”


将带有服务帐户的文件上载到共享驱动器时遇到问题,应采取以下步骤进行故障排除:
  • 隔离问题
  • 扪心自问——问题是与服务帐户的使用有关还是与其他问题有关
  • 为此,在没有服务帐户的情况下测试相同的请求
  • 如果服务帐户被证明是罪魁祸首
    • 验证您是否在GCP控制台中正确启用了域范围的委派
    • 验证您在管理控制台中为委托服务帐户提供了正确的作用域
  • 验证您的代码实现是否正确
  • 如果问题与服务帐户无关-请验证是否与代码语法相关或与请求相关
  • 为此,使用该工具测试您的请求,无需编码
    • 如果问题与编码相关-调试代码
    • 如果问题与请求相关,请根据错误进行操作。尝试此API返回给您
  • 如果您收到一个
    404文件未找到
    错误-这意味着
    • 文件位于共享驱动器上(在这种情况下,您必须如上所述将
      supportsAllDrives
      设置为
      true
    • 或者文件ID不正确
    • 或者您用于身份验证的帐户无法访问该文件

查看您的完整代码,包括将服务帐户创建代码与您的代码合并,这会有所帮助,尤其是
驱动器的定义。我希望现在一切都清楚@ziganotschka。我相信您的错误来自您没有定义
supportsAllDrives=true
。请在没有服务帐户的情况下测试它,从.Java客户端为file.create函数设置了setSupportSteamDrive选项。我找不到此属性supportsAllDrives。请参阅。此选项在setSupportsAllDrives中不可用,只有此选项在SetSupportsStreamDrives中可用。。我正在使用compile'com.google.api客户端:google api客户端:1.23.0'compile'com.google.oauth客户端:google oauth客户端jetty:1.23.0'compile“com.google.api:google api services drive:v3-rev110-1.23.0”和@Aerials@ziganotschka,当我试图用于列出内容时
/*。settamdriveid(“共享驱动器id”)。setCorpora(“驱动器”)。setSupportsTeamDrives(true)。setIncludeTeamDriveItems(true)*/
我得到一个错误,共享驱动器没有found@ArpitPruthi您想使用不推荐使用的方法:
supportsTeamDrives
。如果Gooogle不赞成它,那么它不会为你服务。请阅读可选参数“SupportSteamDrive”的说明。这意味着您可能需要将客户端升级到最新版本。我尝试更新java客户端,并获得了所有驱动器的支持,但仍无法将数据上载到共享驱动器。。我已手动创建了此共享驱动器,并将服务帐户作为content manager添加到该驱动器(如果这导致任何问题)。总结如下:1。您只需要使用
.setIncludeTeamDriveItems(true)
,而不需要使用
.setIncludeTeamDriveItems(true)
。2.如果出现找不到驱动器的错误,则表示您提供的Id不正确,或者您没有与服务帐户正确共享驱动器。我建议您再测试一次-这有助于验证驱动器id和其他选项是否设置正确,并缩小错误源。
        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;