在我的应用程序中,当用户单击我的应用程序中表单上的链接时,我试图强制从Google Team Drive下载文件。
一些更新:
我有可以上传到Team Drive以及在Team Drive上创建文件夹的代码。
“团队驱动器支持-此应用程序可与团队驱动器中的文件正常工作”。无法启用Google Drive API设置上的-我可以选中此框,但是由于总是禁用该按钮,因此无法单击“保存更改”按钮。但是,我认为这不是问题,因为我可以在代码中与Team Drive进行交互。
我已阅读了非常有限的Google文档:
https://developers.google.com/drive/v3/web/manage- downloads
https://developers.google.com/drive/v3/reference/files/get
我还阅读了一些帖子:
使用Java API从Google Drive下载文件
但是,我找不到有效的答案。我建立了一些使用服务帐户的代码。该代码设置驱动器服务并将服务帐户用作凭据。我基于此Google文档示例的代码下载部分:
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; }
当我的代码运行时,没有错误,也没有任何反应。我猜我在downloadFile函数中缺少一些代码。如果我在编码中遗漏了一些东西或不正确,请随时提供示例或我应该使用的正确代码。
感谢您的帮助。
该演示不使用服务帐户。
我将演示如何下载Team驱动器文件,并希望它可以使您对项目有深入的了解。
该代码的基础来自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为true,同时将fields参数设置为,webContentLink以便它仅返回该值。
webContentLink
supportsTeamDrives
true
fields
当然,您始终可以以files.get编程方式使用Java 来进行获取,webContentLink但是webContentLink使用Try- it进行获取对于测试目的而言更为容易。
files.get