使用 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不正确
- 或者您用于身份验证的帐户无法访问该文件
我想使用 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不正确
- 或者您用于身份验证的帐户无法访问该文件
- 文件位于共享驱动器上(在这种情况下,您必须如上所述将