【问题标题】:uploading file to specific folder in S3 bucket using boto3使用 boto3 将文件上传到 S3 存储桶中的特定文件夹
【发布时间】:2019-09-01 03:42:28
【问题描述】:

我的代码正在运行。我面临的唯一问题是我无法在 S3 存储桶中指定要放置文件的文件夹。这就是我所拥有的:

with open("/hadoop/prodtest/tips/ut/s3/test_audit_log.txt", "rb") as f:
    s3.upload_fileobj(f, "us-east-1-tip-s3-stage", "BlueConnect/test_audit_log.txt")

【问题讨论】:

  • BlueConnect/更改为您想要的任何文件夹。
  • BlueConnect 是文件夹名称,我要在其中上传文件
  • 那么到底是什么不工作?你收到错误消息还是什么?

标签: python-2.7 amazon-web-services amazon-s3 boto3


【解决方案1】:

@danimal 的解释几乎涵盖了所有内容。如果您只想在 s3 中创建一个类似文件夹的对象,您可以简单地指定该文件夹名称并以“/”结尾,这样当您从控制台查看它时,它看起来就像一个文件夹。

它相当没用,一个空对象,没有主体(将其视为具有空值的键)只是为了吸引眼球,但如果你真的想这样做,你可以。 1)您可以在控制台上以交互方式创建它,因为它为您提供了该选项 2_您可以使用aws sdk。 boto3 有用于 s3 客户端的 put_object 方法,您将键指定为“your_folder_name/”,请参见下面的示例:

import boto3
session = boto3.Session() # I assume you know how to provide credentials etc.
s3 = session.client('s3', 'us-east-1')

bucket = s3.create_bucket('my-test-bucket')
response = s3.put_object(Bucket='my-test-bucket', Key='my_pretty_folder/' # note the ending "/"

你有你的桶。

同样,当您上传文件时,您指定“my-test-bucket/my_file”,您所做的是创建一个名为“my-test-bucket/my_file”的“key” " 并将文件的内容作为其“value”。

在这种情况下,存储桶中有 2 个对象。第一个对象的主体为空,看起来像一个文件夹,而第二个对象看起来像在里面,但正如@danimal 指出的那样,实际上您在同一平面层次结构中创建了 2 个键,它只是“看起来像”我们使用的在文件系统中查看。

如果你删除文件,你仍然有其他对象,所以在 aws 控制台上,看起来文件夹仍然存在,但里面没有文件。

如果您跳过创建文件夹并像以前一样简单地上传文件,您仍会在 AWS 控制台中看到文件夹结构,但此时您只有一个对象。

但是,当您从命令行列出对象时,您会看到一个对象,如果您在控制台上删除它,看起来文件夹也不见了。

【讨论】:

    【解决方案2】:

    S3 中的文件(“对象”)实际上是通过它们的“键”(~文件夹+文件名)存储在存储桶中的 flat 结构中。如果您在密钥中放置斜杠 (/),则 S3 向用户表示这一点,就好像它是文件夹结构的标记一样,但这些文件夹实际上并不存在于 S3 中,它们只是为用户提供方便,并且允许大多数文件系统熟悉的常用文件夹导航。

    因此,就您的代码而言,尽管您似乎将一个名为 test_audit_log.txt 的文件放在名为 BlueConnect 的文件夹中,但实际上您只是将一个代表您的文件的对象放在 us-east-1-tip-s3-stage 存储桶中,并带有BlueConnect/test_audit_log.txt 的密钥。然后为了(似乎)将它放在一个新文件夹中,只需将密钥设为文件的完整路径应该是什么,例如:

    # upload_fileobj(file, bucket, key)
    s3.upload_fileobj(f, "us-east-1-tip-s3-stage", "folder1/folder2/test_audit_log.txt")
    

    在本例中,对象的“键”是folder1/folder2/test_audit_log.txt,您可以将其视为文件test_audit_log.txt,位于文件夹folder1 内,该文件夹位于@987654330 文件夹内@ - 这就是它在 S3 上的显示方式,在文件夹结构中,通常与本地计算机的文件夹结构不同且分开。

    【讨论】:

    • 你能解释一下吗,full/path/to/file/test_audit_log.txt?是 http 还是我的本地文件位置?
    • 也不是,是你的S3存储桶的文件夹结构,见编辑
    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多