我正在从这里使用代码: 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文件
答案 0 :(得分:0)
您正在使用ByteArrayOutputStream
对象作为下载的输出。如果您的程序在没有将该对象的内容保存到某处的情况下终止了,您将无法在计算机磁盘上找到此信息,因为该信息并未写入其中,而是作为缓冲字节数组保存在内存中(请参阅有关更多信息的上一个链接。
如果要将下载的输出保存到文件中,建议您使用FileOutputStream
作为下载的目的地。为此,您必须按如下所示修改代码:
添加适当的import
声明:
import java.io.FileOutputStream;
按如下所示修改outputStream
变量分配:
OutputStream outputStream = new FileOutputStream('/tmp/downloadedfile');
传递给FileOutputStream
的参数应该是下载所需的目标路径。
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();
}
}