当前位置: 首页 > 知识库问答 >
问题:

bucket中Ruby access文件夹的aws sdk

沈运恒
2023-03-14

我在Amazon S3上有一个存储桶,其中包含文件夹。我试图通过aws-sdk gem以以下方式访问它:

s3 = AWS::S3.new(
    :access_key_id => "KEY",
    :secret_access_key => "SECRET"
)

bucket = s3.buckets["my_bucket/my_folder"]
bucket.do_stuff....

我得到以下错误作为回报:

您尝试访问的存储桶必须使用指定的endpoint进行寻址。请将所有未来的请求发送到此endpoint。

你知道我做错了什么吗?

共有3个答案

隗嘉歆
2023-03-14
has_attached_file :photo,
  storage: :s3,
  styles: { medium: "300x300>", thumb: "100x100>" },
  s3_credentials: "#{Rails.root}/config/aws.yml",
  bucket: "bucket-name",
  s3_host_name: "s3-ap-southeast-1.amazonaws.com",
  url: ":s3_domain_url",
  path: 'books/:id/photo/:style_:basename.:extension'

为我工作:)

陆高峰
2023-03-14

您需要为bucket(创建bucket的位置)配置特定于区域的endpoint。您可以通过以下方式执行此操作:

AWS.config(:s3_endpoint => '...')
s3 = AWS::S3.new

s3 = AWS::S3.new(:s3_endpoint => '...')

将来可以通过使用DNS兼容的bucket名称来避免这种情况(也可以避免bucket名称中的点)。如果bucket名称是有效的子域,则可以寻址bucket,而无需配置特定于区域的endpoint。考虑以下因素:

http:://bucket-name.s3.amazonaws.com/path/to/object.txt

其中,bucket命名为“bucket name”,object键为“path/to/object.txt”。此bucket可以存在于任何区域中,但您可以使用“默认”区域访问它。当bucket名称与dns不兼容时,url如下所示:

http://s3.amazon.com/bucket/name/path/to/object.txt

在上面的示例中,bucket是“bucket/name”,它与dns不兼容。它成为路径的一部分,现在是s3。亚马逊。com必须替换为特定于区域的endpoint(如果bucket不是在经典区域中创建的)。

正如其他人提到的,路径应该是对象键的一部分,而不是bucket名称。这允许您按公共前缀对对象进行分组。“/”用作虚拟文件夹(仅按约定)。

# print the key of every object with the given prefix
s3.buckets['bucket-name'].objects.with_prefix('path/to/').each do |object|
  puts object.key
end
韩捷
2023-03-14

可能正在尝试使用的S3存储桶位于美国东部以外(默认位置),因此这应该可以帮助您:

s3 = AWS::S3.new(
    :access_key_id => "KEY",
    :secret_access_key => "SECRET"
    :s3_endpoint => 's3-eu-west-1.amazonaws.com'
)

从以下列表中选择S3 enpdpoint:

US Standard *                           s3.amazonaws.com(default)
US West (Oregon) Region                 s3-us-west-2.amazonaws.com
US West (Northern California) Region    s3-us-west-1.amazonaws.com
EU (Ireland) Region                     s3-eu-west-1.amazonaws.com
Asia Pacific (Singapore) Region         s3-ap-southeast-1.amazonaws.com
Asia Pacific (Tokyo) Region             s3-ap-northeast-1.amazonaws.com
South America (Sao Paulo) Region        s3-sa-east-1.amazonaws.com

在对象访问方面,桶名my_bucket,但my_folder应该是对象的一部分。

 类似资料:
  • 有一个spring boot应用程序,我尝试在S3目标存储桶的文件夹中放置一个文件。目标bucket/targetsystem文件夹/文件。csv 将从yml配置文件检索的每个文件的targetsystem文件夹名称将不同。 如果该文件夹未退出,则必须通过代码创建targetsystem文件夹,并将文件放在该文件夹下 据我所知,在S3桶中没有文件夹概念,所有文件都存储为对象。 阅读了一些文档,比如

  • 我将一个bucket名称存储为string 我想从这个s3桶下载文件,并作为附件结束一封电子邮件。这个文件夹中只有一个文件,但要得到这个文件,我们需要在文件夹上迭代,因为我不知道文件的名称。 这是我正在做的,但这个代码给我错误。 str对象没有属性 这是我的python代码 我是python新手

  • 我正在尝试将文件上传到s3存储桶中的文件夹中。我正在用PHP做以下工作: 桶名是发送到PHP的字符串,表示使用正斜杠的子文件夹: 然而,当我将一个新图像上传到我的bucket时,它会被上传到bucket root。如何将此文件上载到bucket中的子文件夹? 谢谢

  • 使用boto3,我可以访问我的AWS S3桶: 您可以看到,检索了特定的文件,在本例中是,而我只想获取目录的名称。原则上,我可以从所有路径中删除目录名,但在第三级检索所有内容以获得第二级是丑陋和昂贵的! 我也尝试了这里报道的一些东西: 但是我没有得到所需级别的文件夹。

  • 我正在使用node的开发者工具包将图像上传到AWS S3: 这是可行的,但我如何才能使图像上传到一个特定的文件夹中的桶?

  • 我是亚马逊和java的新手。我在这里尝试两件事。 第一-我试图在我的Amazon S3存储桶中创建一个文件夹,我已经创建并获得了凭据。 第二-我正在尝试将文件上传到这个存储桶。 根据我的理解,我可以使用putObjectRequest()方法来完成这两个任务。 用于上传文件。 我不确定我是否应该使用这种方法 仅用于创建文件夹。我正在努力学习InputSteam和ObjectMetadata。我不知