当前位置: 首页 > 知识库问答 >
问题:

Google Drive API不下载文件(Java v3)

宋英杰
2023-03-14
    String fileId = "some file ID";
    OutputStream outputStream = new ByteArrayOutputStream();
    driveService.files().get(fileId)
    .executeMediaAndDownloadTo(outputStream);

我没有发现代码实际下载文件的迹象,也不知道文件是否真的下载了。我不确定我是否使用了正确的范围来获得下载文件的权限。只要我知道文件ID,我就可以上传、列出和删除文件,但下载似乎不起作用。

    private static final List<String> SCOPES = Collections.singletonList(DriveScopes.DRIVE);

或者,我尝试创建一个方法来执行下载协议,如下所示:

    private static void downloadFile(Drive service, File file (or String fileID)){
    }

但我不确定如何做到这一点。我尝试在网上寻找样本,但大多数来自v1或v2 API,似乎对我不起作用。

另外,我在某个地方读到,下载文件夹是不可能的。取而代之的是,我必须逐一下载文件夹中的每一项。那么,我是否必须创建一个ArrayList/List/Array,并在初始化一个变量来表示FileID之后遍历它呢?

编辑:已经取得了一些进展,但我仍有一些问题要解决。

    List<File> files = result.getFiles();
    File newFile;
    if (files == null || files.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());
            String fileId = file.getId();
            //System.out.println(fileId);
            String fileName = file.getName();
            //System.out.println(fileName);
            OutputStream outputstream = new FileOutputStream();
            service.files().get(fileId)
            .executeMediaAndDownloadTo(outputstream);
            outputstream.flush();
            outputstream.close();
    }
    OutputStream outputstream = new FileOutputStream();
            service.files().get(fileId)
            .executeMediaAndDownloadTo(outputstream);

下载所有文件。

我在Google Drive中的文件夹层次结构如下所示:

日志

----一堆。bin文件

--.xml文件

--.xml文件

共有1个答案

丘智志
2023-03-14

您正在使用ByteArrayOutputStream对象作为下载的输出。如果程序终止时没有将此对象的内容保存在某个地方,那么您将无法在计算机磁盘中找到此信息,因为它没有写入磁盘,而是以缓冲字节数组的形式保存在内存中(有关详细信息,请参阅前面的链接)。

如果您想将下载的输出保存到文件中,我建议您使用FileOutputStream作为下载的目的地。为了做到这一点,您必须按以下方式修改代码:

>

  • 添加适当的导入声明:

    import java.io.FileOutputStream;
    
    OutputStream outputStream = new FileOutputStream('/tmp/downloadedfile');
    
    outputStream.flush();
    outputStream.close();
    
    String destinationFolder = "/tmp/downloadedfiles/";
    List<File> files = result.getFiles();
    File newFile;
    if (files == null || files.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());
        String fileId = file.getId();
        String fileName = file.getName();
        OutputStream outputstream = new FileOutputStream(destinationFolder + fileName);
        service.files().get(fileId)
               .executeMediaAndDownloadTo(outputstream);
        outputstream.flush();
        outputstream.close();
      }
    }
    
    

  •  类似资料:
    • 下载 <?php /** * 下载文件请求示例 */ require dirname(__DIR__) . '/vendor/autoload.php'; use Yurun\Util\HttpRequest; use Yurun\Util\YurunHttp; use Yurun\Util\YurunHttp\Handler\Swoole; $url = 'http://www.baid

    • 文件名的开始是相同的,但结束是动态的,每次我点击下载时都会改变 我所做的: 你能帮忙吗

    • 基于@ari答案的解决方案我已经更新了代码。现在它被优化到只使用1MB(我不知道这是否是将进程分成块的最佳方式,但现在它似乎得到了改进,并且不提供OOM)。我将尝试通过检测可以使用多少堆内存来进一步优化它,但我不确定是否可以实现这一点。直到比这似乎是最好的选择。再次感谢@Ari。

    • 问题内容: 我正在尝试使用Flask创建一个Web应用程序,该应用程序允许用户上传文件并将其提供给其他用户。现在,我可以将文件正确地上传到upload_folder了。但是我似乎找不到找到让用户下载回来的方法。 我将文件名的名称存储到数据库中。 我有一个为数据库对象服务的视图。我也可以删除它们。 在我的HTML中,我有: 和下载视图: 但它正在返回: 未找到 在服务器上找不到请求的URL。如果您手

    • 问题内容: 我是使用Django的新手,我正在尝试开发一个网站,用户可以在其中上传许多excel文件,然后将这些文件存储在媒体文件夹Webproject / project / media中。 然后,该文档会与它们上载的任何其他文档一起显示在列表中,你可以单击这些文档,它会显示有关它们的基本信息以及他们上载的excelfile的名称。从这里,我希望能够使用链接再次下载相同的excel文件: 我的网

    • 问题内容: 我正在使用简单的文件下载脚本: 它在最大200mb的本地服务器上运行。 当我在我的网站上尝试此代码时,它将下载173KB而不是200MB的文件。 我检查了所有内容,编写了一些自定义代码(使用ob函数和fread而非readfile),但无法下载大文件。 谢谢您的回答。 我正在使用Apache 2.2,PHP 5.3 可以处理所有大文件的所有PHP设置。(执行时间,内存限制,… 问题答案

    • 当我尝试使用Java代码以编程方式下载文件时,遇到了一个异常: 下面是我的代码,包括我想下载的文件: 最初我尝试使用协议下载,但它给我一个状态代码,因此我意识到它重定向到。但是,从上面给出了。使用浏览器,下载工作完美无缺。如何使用Java代码正确下载文件?

    • 我有一个文件表示为块的列表,目标是下载所有块,加入并保存为一个文件。 它应该适用于大文件 应该是跨浏览器解决方案 null null null null 但我仍然无法实现我的目标与涵盖的需求… 如果有人有经验,最好的解决方案,我恳请分享它在这里。谢谢