如何使用 Java 中的 Google Drive API 库强制从 Google 团队云端硬盘下载文件



在我的应用中,当用户点击我应用程序中表单上的链接时,我试图强制从 Google 团队云端硬盘下载文件。

一些更新:

  1. 我有代码可以上传到团队云端硬盘,也可以在团队云端硬盘上创建文件夹。

  2. 无法
  3. 启用 Google 云端硬盘 API 设置上的"团队云端硬盘支持 - 此应用程序可正常处理团队云端硬盘中的文件",我可以选中此框,但无法单击保存更改按钮,因为该按钮始终处于禁用状态。 但是,我认为这不是问题所在,因为我可以在代码中与团队云端硬盘进行交互。

我已经阅读了谷歌文档,它非常有限:

https://developers.google.com/drive/v3/web/manage-downloads

https://developers.google.com/drive/v3/reference/files/get

我还通读了几篇文章:

使用 java API 从谷歌云端硬盘下载文件

但是,我找不到有效的答案。 我已经构建了一些使用服务帐户的代码。 该代码设置驱动器服务并使用服务帐户作为凭据。 我从这个谷歌文档示例中下载了我的代码部分:

https://developers.google.com/drive/v3/web/manage-downloads#examples

这是我正在使用的代码:

public static void downloadFile(String fileID) {
// Set the drive service...
Drive service = null;
try {
service = getDriveService();
} catch (IOException e) {
e.printStackTrace();
}
OutputStream outputStream = new ByteArrayOutputStream();
try {
service.files().get(fileID).executeMediaAndDownloadTo(outputStream);
// NEED CODE HERE???????

} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Build and return an authorized Drive client service.
* 
* @return an authorized Drive client service
* @throws IOException
*/
public static Drive getDriveService() throws IOException {
Logger.info("GoogleDrive: getDriveService: Starting...");
GoogleCredential credential = null;
Drive googleDrive = null;
try {
credential = authorize();
Logger.info("GoogleDrive: getDriveService: Credentials set...");
googleDrive = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME).build();
} catch (IOException ex) {
System.out.println(ex.toString());
ex.printStackTrace();
}
return googleDrive;
}
/**
* Creates an authorized Credential object.
* 
* @return an authorized Credential object.
* @throws IOException
*/
@SuppressWarnings("deprecation")
public static GoogleCredential authorize() throws IOException {
GoogleCredential credential = null;
String credentialsFileName = "";
try {
Logger.info("GoogleDrive: authorize: Starting...");
Logger.info("GoogleDrive: authorize: Getting credentialsFileName path...");
credentialsFileName = Configuration.root().getString("google.drive.credentials.file");
Logger.info("GoogleDrive: authorize: credentialsFileName = " + credentialsFileName);
Logger.info("GoogleDrive: authorize: Setting InputStream...");
InputStream in = GoogleDrive.class.getClassLoader().getResourceAsStream(credentialsFileName);
if (in == null) {
Logger.info("GoogleDrive: authorize: InputStream is null");
}
Logger.info("GoogleDrive: authorize: InputStream set...");
Logger.info("GoogleDrive: authorize: Setting credential...");
credential = GoogleCredential.fromStream(in, HTTP_TRANSPORT, JSON_FACTORY)
.createScoped(Collections.singleton(DriveScopes.DRIVE));
} catch (IOException ex) {
System.out.println(ex.toString());
System.out.println("Could not find file " + credentialsFileName);
ex.printStackTrace();
}
Logger.info("GoogleDrive: authorize: Ending...");
return credential;
}

当我的代码运行时,没有错误,没有任何反应。 我猜我在下载文件函数中缺少一些代码。 如果我的编码中缺少某些内容或不正确,请随时提供示例或我应该使用的正确代码。

我很感激你的帮助。

此演示不使用服务帐户。

我只是要演示我是如何下载团队云端硬盘文件的,希望它能让您深入了解您的项目。

代码的基础取自Drive API Java Quickstart:

public static void main(String... args) throws IOException, GeneralSecurityException {
// Build a new authorized API client service.
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME)
.build();
//this is what you're looking for - a way to download a file using 'webContentLink'
try {        
Desktop desktop = java.awt.Desktop.getDesktop();
//place your webContentLink in the oURL variable
URI oURL = new URI("https://drive.google.com/a/google.com/uc?id=YOUR_FILE_ID&export=download");
desktop.browse(oURL);
} catch (Exception e) {
e.printStackTrace();
}
}

执行后,该程序将打开一个空白的浏览器窗口并将文件下载到您的计算机。

我生成webContentLink的方式只是使用 Files.get Try-it 并确保我supportsTeamDrives设置为truefields并将参数设置为webContentLink,以便它返回该参数。

当然,您始终可以通过编程方式使用 Javafiles.get来获取webContentLink但是使用 Try-it 获取webContentLink对于测试目的来说更容易。

相关内容

最新更新