首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Google App Engine Flex上运行时,使用Java将文件从Google Storage Bucket移动到Google Drive

在Google App Engine Flex上运行时,使用Java将文件从Google Storage Bucket移动到Google Drive
EN

Stack Overflow用户
提问于 2018-03-27 02:00:48
回答 2查看 2K关注 0票数 2

我正在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存储代码:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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?

感谢你的帮助。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49497778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档