当前位置: 首页 > 面试题库 >

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

姜旭
2023-03-14
问题内容

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

一些更新:

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

  2. “团队驱动器支持-此应用程序可与团队驱动器中的文件正常工作”。无法启用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(html" target="_blank">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,并确保将其设置supportsTeamDrivestrue,同时将fields参数设置为,webContentLink以便它仅返回该值。

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



 类似资料:
  • 问题内容: 我有图像列表,我希望每个图像都有一个“下载”链接,以便用户可以下载图像。 所以有人可以指导我如何为php中的任何文件提供下载链接吗? 编辑 我希望在单击下载链接时显示一个下载面板,但我不想导航到要在浏览器中显示的图像 问题答案: 如果要强制下载,可以使用如下所示的内容: 如果仅使用常规链接链接到此脚本,则将下载文件。 顺便说一句,上面的代码段需要在页面的开头执行(在没有任何标题或HTM

  • 问题内容: 我希望在我的一个站点的每个视频下方添加“下载此文件”功能。我需要强迫用户下载文件,而不仅仅是链接到文件,因为有时这会开始在浏览器中播放文件。问题是,视频文件存储在单独的服务器上。 有什么办法可以强制用PHP下载吗? 问题答案: 您可以尝试这样的事情: 我刚刚测试了它,它对我有用。 请注意,为了能够读取远程URL,您需要启用它。

  • 问题内容: 一切正常,但是只有当文件很小(大约1MB)时,当我尝试使用更大的文件(例如20MB)时,我的浏览器将其显示,而不是强制下载,到目前为止,我尝试了许多标头,现在我的代码看起来像: 问题答案: 在将文件内容写入输出流之后,你将设置响应头。在响应生命周期中设置标头很晚。正确的操作顺序应该是首先设置头,然后将文件的内容写入servlet的输出流。 因此,你的方法应编写如下(由于仅是表示形式,因

  • 问题内容: 我有图像列表,我希望每个图像都带有“下载”链接,以便用户可以下载图像。 所以有人可以指导我如何为php中的任何文件提供下载链接吗? 编辑 我希望在单击下载链接时显示一个下载面板,但我不想导航到要在浏览器中显示的图像 问题答案: 如果要强制下载,可以使用类似以下的内容: 如果仅使用常规链接链接到此脚本,则将下载文件。 顺便说一句,上面的代码段需要在页面的开头执行(在没有任何标题或HTML

  • 问题内容: 我的服务器上有一个CSV文件。如果用户单击链接,则应下载该链接,但会在我的浏览器窗口中打开。 我的代码如下 这是我所有开发工作都在上面的普通Web服务器。 我尝试了类似的东西: 现在我文件的内容: 现在我的问题是正在下载,而不是我的CSV文件。它创建一个新文件。 问题答案: .htaccess解决方案 要强行下载服务器上的所有CSV文件,请添加.htaccess文件: PHP解决方案

  • 问题内容: 我希望用户能够下载服务器上的某些文件,但是当我尝试使用Internet上的许多此类示例中的任何一个时,对我来说似乎没有任何作用。我试过这样的代码: 我什至尝试使用我能找到的最基本的示例,如下所示: 测试完此功能后,我删除了所有其他代码,并使用仅包含此代码的空文件来删除由外部源创建的任何错误。 当我在控制台中查看文件时,将使用正确的标题发送文件,即 但是不会显示保存对话框。 我还尝试使用