如何使用Java中的Google Drive API库强制从Google Team Drive下载文件

时间:2018-03-02 15:13:27

标签: java google-api google-drive-api

在我的应用程序中,当用户点击我的应用程序中表单上的链接时,我试图强制从Google Team Drive下载文件。

一些更新:

  1. 我的代码可以上传到Team Drive,也可以在Team Drive上创建文件夹。

  2. " Team Drives支持 - 此应用程序适用于Team Drives中的文件。"无法启用Google Drive API设置 - 我可以选中此框,但我无法点击“保存更改”按钮,因为该按钮始终处于禁用状态。但是,我不认为这是问题所在,因为我可以在代码中与团队驱动器进行互动。

  3. 我已阅读Google文档,该文档非常有限:

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

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

    我还阅读了几篇文章:

    Download files from google drive using java API

    但是,我无法找到有效的答案。我已经构建了一些使用服务帐户的代码。代码设置驱动器服务并使用服务帐户作为凭据。我根据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函数中缺少一些代码。如果我在编码中遗漏了某些内容或不正确,请随时提供我应该使用的示例或正确的代码。

    我很感激帮助。

1 个答案:

答案 0 :(得分:2)

此演示不使用服务帐户。

我将演示如何下载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参数设置为{{ 1}},因此它仅返回该值。

当然,您始终可以始终以编程方式使用Java webContentLink来获取files.get,但是使用Try-it来获取webContentLink更容易进行测试。