【问题标题】:Storing multiple files with the same name in Google Cloud Storage?在 Google Cloud Storage 中存储多个同名文件?
【发布时间】:2014-03-02 07:58:02
【问题描述】:

所以我正在尝试将使用 Flask 编写的 Python webapp 移植到 Google App Engine。该应用程序托管用户上传的最大 200mb 的文件,对于非图像文件,需要保留文件的原始名称。为了防止文件名冲突,例如两个人上传 stuff.zip,每个人都包含完全不同且不相关的内容,该应用程序在文件系统上创建一个 UUID 文件夹并将文件存储在其中,并将其提供给用户。 Google App Engine 的 Cloud Storage,我计划通过制作一个存储桶来存储用户文件——根据他们的文档,它“没有文件夹的概念”。使用他们的系统获得相同功能的最佳方法是什么?

目前的方法,仅供演示:

 # generates a new folder with a shortened UUID name to save files
        # other than images to avoid filename conflicts
        else:
            # if there is a better way of doing this i'm not clever enough
            # to figure it out
            new_folder_name = shortuuid.uuid()[:9]
            os.mkdir(
                os.path.join(app.config['FILE_FOLDER'], new_folder_name))
            file.save(
                os.path.join(os.path.join(app.config['FILE_FOLDER'], new_folder_name), filename))
            new_folder_path = os.path.join(
                app.config['FILE_FOLDER'], new_folder_name)
            return url_for('uploaded_file', new_folder_name=new_folder_name)

【问题讨论】:

    标签: python google-app-engine flask


    【解决方案1】:

    来自Google Cloud Storage Client Library Overview 文档:

    GCS 和“子目录”

    Google Cloud Storage 文档引用了“子目录”,而 GCS 客户端库允许您在创建对象时提供子目录分隔符。但是,GCS 实际上并不将对象存储到任何真正的子目录中。相反,子目录只是对象文件名的一部分。例如,如果我有一个存储桶 my_bucket 并将文件存储在某处/over/the/rainbow.mp3,则文件 Rainbow.mp3 并没有真正存储在某处/over/the/ 的子目录中。它实际上是一个名为某处/over/the/rainbow.mp3 的文件。了解这一点对于使用 listbucket 过滤很重要。

    虽然 Cloud Storage 本身不支持子目录,但它允许您在文件名中使用子目录分隔符。这基本上意味着您的文件的路径仍然看起来 就像它在子目录中一样,即使它不是。这显然只有在您遍历存储桶的全部内容时才应该关注。

    来自Request URIs 文档:

    标准请求的 URI

    对于大多数操作,您可以使用以下任一 URL 来访问对象:

    storage.googleapis.com/<bucket>/<object>

    <bucket>.storage.googleapis.com/<object>

    这意味着他们示例的公共 URL 将是 http://storage.googleapis.com/my_bucket/somewhere/over/the/rainbow.mp3。他们的服务会将其解释为bucket=my_bucketobject=somewhere/over/the/rainbow.mp3(即没有子目录的概念,只是一个带有嵌入斜杠的对象名称);然而,浏览器只会看到路径/my_bucket/somewhere/over/the/rainbow.mp3,并将其解释为文件名是rainbow.mp3

    【讨论】:

    • 嗯。所以对于所有意图和目的来说都是一样的吗?我不需要对应用程序进行任何修改即可读取这样的文件?我仍然希望该文件使用他们的示例作为“rainbow.mp3” - 保留原始文件名。我需要编写代码在上菜之前将所有东西都砍掉吗?
    猜你喜欢
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2021-12-10
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    相关资源
    最近更新 更多