Google云端硬盘API无法下载文件(Java v3)

时间:2019-11-20 02:37:53

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

我正在从这里使用代码: https://developers.google.com/drive/api/v3/manage-downloads#downloading_a_file

我正在使用的代码段如下并放置在main方法中:

    String fileId = "some file ID";
    OutputStream outputStream = new ByteArrayOutputStream();
    driveService.files().get(fileId)
    .executeMediaAndDownloadTo(outputStream);

我没有发现实际下载文件的代码的迹象,如果实际下载文件,我也不知道文件在哪里。 我不确定我是否使用适当的范围来获取下载文件的权限。只要知道fileID,我就可以上传,列出和删除文件,但是下载似乎不起作用。

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

或者,我正在尝试创建一种方法来制定下载协议,如下所示:

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

但不确定如何执行此操作。我尝试过在线查找示例,但是大多数都是从v1或v2 api中获取的,似乎对我不起作用。

此外,我在某处读到无法下载文件夹。相反,我必须一个接一个地下载文件夹中的每个项目。 那么,我是否必须对fileID进行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();
    }

我想要什么: 上面的代码在main方法中。我不知道这是否是正确的方法,但是当程序获取每个文件并执行System.out.printf时,我也希望它下载该文件(具有相同的mimeType和相同的名称也是如此)到在OutputStream构造函数中设置的目标位置(C:// User // some name // Downloads)。

我尝试过的方法: 根据我的测试,它仅按照我想要的方式下载第一个文件,但这仅是因为我在OutputStream中指定了名称和扩展名。我已经初始化了变量'fileId'和'fileName',以便在程序获取下一个文件的元数据时,它们将根据信息而变化,但是我不知道如何在此代码中更改或设置多个构造函数: / p>

    OutputStream outputstream = new FileOutputStream();
            service.files().get(fileId)
            .executeMediaAndDownloadTo(outputstream);

下载所有文件。

我在Google云端硬盘中的文件夹层次结构如下:

日志

-bin(文件夹)

----一堆.bin文件

-.xml文件

-.xml文件

1 个答案:

答案 0 :(得分:0)

您正在使用ByteArrayOutputStream对象作为下载的输出。如果您的程序在没有将该对象的内容保存到某处的情况下终止了,您将无法在计算机磁盘上找到此信息,因为该信息并未写入其中,而是作为缓冲字节数组保存在内存中(请参阅有关更多信息的上一个链接。

如果要将下载的输出保存到文件中,建议您使用FileOutputStream作为下载的目的地。为此,您必须按如下所示修改代码:

  1. 添加适当的import声明:

    import java.io.FileOutputStream;
    
  2. 按如下所示修改outputStream变量分配:

    OutputStream outputStream = new FileOutputStream('/tmp/downloadedfile');
    

    传递给FileOutputStream的参数应该是下载所需的目标路径。

  3. 将任何内容写入文件后,添加以下代码行:
    outputStream.flush();
    outputStream.close();
    
    这样可以确保文件被正确写入。

关于下载文件夹,您完全正确-首先需要获取要下载的文件夹及其每个子级。为了更好地理解该方法,建议您查看以下答案:Download folder with Google Drive API

编辑-下载文件夹的示例

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();
  }
}

相关问题