我正在Google App Engine Flex环境中运行一个应用程序。我的目标是允许从应用程序向Google Drive上传文件。由于App Engine没有文件系统(或者是我真正理解的文件系统),Google的文档中提到要上传到Storage Bucket:
https://cloud.google.com/appengine/docs/flexible/java/using-cloud-storage
我有很好的代码工作-上传到存储桶。Google Drive的代码也运行得很好。
我的问题是-如何将存储桶文件上传到Google Drive?
我发现了一些帖子,它们建议我必须从Storage Bucket下载文件,据我所知,这些文件必须保存到文件系统中,然后由Google Drive代码拾取,然后上传到Google Drive。
copy file from Google Drive to Google Cloud Storage within Google
How to download a file from Google Cloud Storage with Java?
我需要做的就是从Storage Bucket下载中设置一个java.io.File
对象。我有从Google Storage代码返回的blob.getMediaLink()
-可以使用它而不是下载吗?
Google存储代码:
public static String sendFileToBucket(InputStream fileStream, String fileName) throws IOException {
Logger.info("GoogleStorage: sendFileToBucket: Starting...");
GoogleCredential credential = null;
String credentialsFileName = "";
Storage storage = null;
Blob blob = null;
List<Acl> acls = null;
// credential = authorize();
// storage = StorageOptions.getDefaultInstance().getService();
try {
Logger.info("GoogleStorage: sendFileToBucket: Getting credentialsFileName path...");
credentialsFileName = Configuration.root().getString("google.storage.credentials.file");
Logger.info("GoogleStorage: sendFileToBucket: credentialsFileName = " + credentialsFileName);
Logger.info("GoogleStorage: sendFileToBucket: Setting InputStream...");
InputStream in = GoogleStorage.class.getClassLoader().getResourceAsStream(credentialsFileName);
if (in == null) {
Logger.info("GoogleStorage: sendFileToBucket: InputStream is null");
}
Logger.info("GoogleStorage: sendFileToBucket: InputStream set...");
try {
storage = StorageOptions.newBuilder().setCredentials(ServiceAccountCredentials.fromStream(in)).build()
.getService();
} catch (StorageException se) {
System.out.println("--- START ERROR WITH SETTING STORAGE OBJECT ---");
se.printStackTrace();
System.out.println("--- END ERROR WITH SETTING STORAGE OBJECT ---");
}
// Modify access list to allow all users with link to read file
acls = new ArrayList<>();
acls.add(Acl.of(Acl.User.ofAllUsers(), Acl.Role.READER));
try {
Logger.info("GoogleStorage: sendFileToBucket: Setting Blob object...");
blob = storage.create(BlobInfo.newBuilder(BUCKET_NAME, fileName).setAcl(acls).build(), fileStream);
Logger.info("GoogleStorage: sendFileToBucket: Blob Object set...");
} catch (StorageException se) {
System.out.println("--- START ERROR WITH SETTING BLOB OBJECT ---");
se.printStackTrace();
System.out.println("--- END ERROR WITH SETTING BLOB OBJECT ---");
}
} catch (IOException ex) {
System.out.println("--- START ERROR SENDFILETOBUCKET ---");
ex.printStackTrace();
System.out.println("--- END ERROR SENDFILETOBUCKET ---");
}
Logger.info("GoogleStorage: sendFileToBucket: blob.getMediaLink() = " + blob.getMediaLink());
return blob.getMediaLink();
}
Google Drive代码:
public static String uploadFile(java.io.File file, String folderIDToFind) throws IOException {
String fileID = "";
String fileName = "";
try {
Logger.info("GoogleDrive: uploadFile: Starting File Upload...");
// Build a new authorized API client service.
Drive service = getDriveService();
Logger.info("GoogleDrive: uploadFile: Completed Drive Service...");
// Set the folder...
String folderID = Configuration.root().getString("google.drive.folderid");
Logger.info("GoogleDrive: uploadFile: Folder ID = " + folderID);
String folderIDToUse = getSubfolderID(service, folderID, folderIDToFind);
String fullFilePath = file.getAbsolutePath();
Logger.info("GoogleDrive: uploadFile: Full File Path: " + fullFilePath);
File fileMetadata = new File();
// Let's see what slashes exist to get the correct file name...
if (fullFilePath.contains("/")) {
fileName = StringControl.rightBack(fullFilePath, "/");
} else {
fileName = StringControl.rightBack(fullFilePath, "\\");
}
String fileContentType = getContentType(fileName);
Logger.info("GoogleDrive: uploadFile: File Content Type: " + fileContentType);
fileMetadata.setName(fileName);
Logger.info("GoogleDrive: uploadFile: File Name = " + fileName);
Logger.info("GoogleDrive: uploadFile: Setting the folder...");
fileMetadata.setParents(Collections.singletonList(folderIDToUse));
Logger.info("GoogleDrive: uploadFile: Folder set...");
// Team Drive settings...
fileMetadata.set("supportsTeamDrives", true);
FileContent mediaContent = new FileContent(fileContentType, file);
File fileToUpload = service.files().create(fileMetadata, mediaContent).setSupportsTeamDrives(true)
.setFields("id, parents").execute();
fileID = fileToUpload.getId();
Logger.info("GoogleDrive: uploadFile: File ID: " + fileID);
} catch (Exception ex) {
System.out.println(ex.toString());
ex.printStackTrace();
}
Logger.info("GoogleDrive: uploadFile: Ending File Upload...");
return fileID;
}
在上面的帖子中,我看到了如何获取Storage Bucket文件--但我将其转到了java.io.file
对象:
How to download a file from Google Cloud Storage with Java?
感谢你的帮助。
https://stackoverflow.com/questions/49497778
复制相似问题