首页 > 解决方案 > 使用 boto3 将文件上传到 S3 存储桶中的特定文件夹

问题描述

我的代码正在运行。我面临的唯一问题是我无法在 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")

标签: python-2.7amazon-web-servicesamazon-s3boto3

解决方案


@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 ”并将文件的内容作为它的“价值”。

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

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

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

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


推荐阅读