在 Android Studio 中使用 Google 驱动器 API 从驱动器下载文件以上传到另一个驱动器
Download file from drive to upload into another drive using Google Drive API in Android Studio
所以,在我的应用程序中,我需要从用户的驱动器中获取一个文件并将其上传到我的。
我搜索过,似乎唯一的方法是从用户的驱动器下载文件,然后将其上传到我的。
我已经解决了所有 OAuth2 问题,我可以创建、获取和列出文件。
但我的问题是,根据 google 的文档,我应该将文件下载到声明为 OutputStream 的 ByteArrayOutputStream,但是当我上传文件时,我应该上传一个 java.io 文件
有谁知道如何从下载方法中获取输出流并将其转换为文件以便发送到上传方法?
到目前为止,这是我的代码:
下载文件的代码(我从google得到的)
public Task<java.io.File> downloadFile(PostFileHolder postFileHolder) {
return Tasks.call(mExecutor, () -> {
// Retrieve the metadata as a File object.
Log.i("download file", "chegou");
OutputStream outputStream = new ByteArrayOutputStream();
mDriveService.files().export(postFileHolder.getGoogleId(), "application/pdf")
.executeMediaAndDownloadTo(outputStream);
// I need to use the export method because I will have some docs and slides files
return null;
});
}
这是上传文件的代码:
public Task<File> uploadFileWithMetadata(java.io.File javaFile, String mimeType, boolean isSlide, @Nullable final String folderId) {
return Tasks.call(mExecutor, () -> {
Log.i("upload file", "chegou" );
String convertTo;
if(isSlide){
convertTo = TYPE_GOOGLE_SLIDES;
}
else{
convertTo = TYPE_GOOGLE_DOCS;
}
List<String> folder;
if (folderId == null) {
folder = Collections.singletonList("root");
} else {
folder = Collections.singletonList(folderId);
}
File metadata = new File()
.setParents(folder)
.setName(javaFile.getName())
.setMimeType(convertTo);
FileContent mediaContent = new FileContent(convertTo, javaFile);
File uploadedFile = mDriveService.files().create(metadata, mediaContent)
.setFields("id,name,size,createdTime,modifiedTime,starred,thumbnailLink,mimeType")
.execute();
Log.i("File ID: " , uploadedFile.getId());
return uploadedFile;
});
}
谢谢!
您可以简单地使用以下最少的代码来创建一个文件。稍后使用此文件上传。
val outputStream = ByteArrayOutputStream() // Your
val byteData = bos.toByteArray()
val mainFile = File("Path with filename")
//write the bytes in file
val fos = FileOutputStream(mainFile)
fos.write(bitmapdata)
fos.flush()
fos.close()
因为你的 outputStream 被初始化为 ByteArrayOutputStream 所以你可以简单地使用 cast 方法,例如 ((ByteArrayOutputStream) outputStream).toByteArray()
关于路径,您可以将文件保存在内部文件目录或外部存储中的任何位置作为临时文件。我建议您阅读 Data and File Storage Overview and this 教程以获取更多信息。
所以,在我的应用程序中,我需要从用户的驱动器中获取一个文件并将其上传到我的。
我搜索过,似乎唯一的方法是从用户的驱动器下载文件,然后将其上传到我的。
我已经解决了所有 OAuth2 问题,我可以创建、获取和列出文件。
但我的问题是,根据 google 的文档,我应该将文件下载到声明为 OutputStream 的 ByteArrayOutputStream,但是当我上传文件时,我应该上传一个 java.io 文件
有谁知道如何从下载方法中获取输出流并将其转换为文件以便发送到上传方法?
到目前为止,这是我的代码:
下载文件的代码(我从google得到的)
public Task<java.io.File> downloadFile(PostFileHolder postFileHolder) {
return Tasks.call(mExecutor, () -> {
// Retrieve the metadata as a File object.
Log.i("download file", "chegou");
OutputStream outputStream = new ByteArrayOutputStream();
mDriveService.files().export(postFileHolder.getGoogleId(), "application/pdf")
.executeMediaAndDownloadTo(outputStream);
// I need to use the export method because I will have some docs and slides files
return null;
});
}
这是上传文件的代码:
public Task<File> uploadFileWithMetadata(java.io.File javaFile, String mimeType, boolean isSlide, @Nullable final String folderId) {
return Tasks.call(mExecutor, () -> {
Log.i("upload file", "chegou" );
String convertTo;
if(isSlide){
convertTo = TYPE_GOOGLE_SLIDES;
}
else{
convertTo = TYPE_GOOGLE_DOCS;
}
List<String> folder;
if (folderId == null) {
folder = Collections.singletonList("root");
} else {
folder = Collections.singletonList(folderId);
}
File metadata = new File()
.setParents(folder)
.setName(javaFile.getName())
.setMimeType(convertTo);
FileContent mediaContent = new FileContent(convertTo, javaFile);
File uploadedFile = mDriveService.files().create(metadata, mediaContent)
.setFields("id,name,size,createdTime,modifiedTime,starred,thumbnailLink,mimeType")
.execute();
Log.i("File ID: " , uploadedFile.getId());
return uploadedFile;
});
}
谢谢!
您可以简单地使用以下最少的代码来创建一个文件。稍后使用此文件上传。
val outputStream = ByteArrayOutputStream() // Your
val byteData = bos.toByteArray()
val mainFile = File("Path with filename")
//write the bytes in file
val fos = FileOutputStream(mainFile)
fos.write(bitmapdata)
fos.flush()
fos.close()
因为你的 outputStream 被初始化为 ByteArrayOutputStream 所以你可以简单地使用 cast 方法,例如 ((ByteArrayOutputStream) outputStream).toByteArray()
关于路径,您可以将文件保存在内部文件目录或外部存储中的任何位置作为临时文件。我建议您阅读 Data and File Storage Overview and this 教程以获取更多信息。