android - 使用 Android Studio 中的 Google Drive API 从驱动器下载文件以上传到另一个驱动器
问题描述
所以,在我的应用程序中,我需要从用户的驱动器中获取一个文件并将其上传到我的。
我已经搜索过,似乎唯一的方法是从用户的驱动器下载文件,然后将其上传到我的。
我已经解决了所有 OAuth2 问题,并且能够创建、获取和列出文件。
但我的问题是,根据谷歌的文档,我应该将文件下载到声明为 OutputStream 的 ByteArrayOutputStream,但是当我上传文件时,我应该上传 java.io 文件
有谁知道我如何从下载方法中获取输出流并将其转换为文件以发送到上传方法?
到目前为止,这是我的代码:
下载文件的代码(我从谷歌得到的)
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()
关于路径,您可以将文件保存在内部文件目录或外部存储中的任何位置作为临时文件。我建议您阅读数据和文件存储概述和本教程以获取更多信息。
推荐阅读
- c# - WPF WindowChrome导致调整大小时闪烁
- r - xgboost 在 R 中设置
- python - 从 TXT 文件创建 python 字典 - 值聚合
- laravel-5 - laravel 控制器中的连接出错
- javascript - 如何使用不同的设置构建 react-create-app?
- kubernetes - Openshift:服务器找不到请求的资源
- ruby-on-rails - Sidekiq::Testing.fake!不伪造 Sidekiq::Queue
- php - 下载错误php之前的电子邮件
- kendo-ui - 剑道窗口绑定 - 不必要的重复动作
- html - 我怎样才能获得我想回复的特定评论的 id