Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails bucket中Ruby access文件夹的aws sdk_Ruby On Rails_Ruby_Amazon S3 - Fatal编程技术网

Ruby on rails bucket中Ruby access文件夹的aws sdk

Ruby on rails bucket中Ruby access文件夹的aws sdk,ruby-on-rails,ruby,amazon-s3,Ruby On Rails,Ruby,Amazon S3,我在AmazonS3上有一个水桶,里面有文件夹。我试图通过aws sdk通过以下方式访问它: s3 = AWS::S3.new( :access_key_id => "KEY", :secret_access_key => "SECRET" ) bucket = s3.buckets["my_bucket/my_folder"] bucket.do_stuff.... 我得到以下错误作为回报: 您试图访问的存储桶必须使用指定的端点寻址。请将所有未来请求发送到此终结

我在AmazonS3上有一个水桶,里面有文件夹。我试图通过aws sdk通过以下方式访问它:

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

bucket = s3.buckets["my_bucket/my_folder"]
bucket.do_stuff....
我得到以下错误作为回报:

您试图访问的存储桶必须使用指定的端点寻址。请将所有未来请求发送到此终结点


你知道我做错了什么吗?

可能是S3存储桶位于美国东部以外(默认位置),因此这应该可以帮助你:

s3 = AWS::S3.new(
    :access_key_id => "KEY",
    :secret_access_key => "SECRET"
    :s3_endpoint => 's3-eu-west-1.amazonaws.com'
)
从以下选项中选择您的S3 enpdpoint:


就对象访问而言,bucket名称是my_bucket,但my_folder应该是对象的一部分。

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

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

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

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

http://s3.amazon.com/bucket/name/path/to/object.txt
在上面的示例中,bucket是“bucket/name”,它与dns不兼容。它成为路径的一部分,现在必须将s3.amazon.com替换为特定于区域的端点(如果bucket不是在经典区域中创建的)

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


为我工作:)

戈德萨尔的答案基本上是正确的。但是,它似乎已经过时了,可能是SDK版本1

这对我来说适用于版本2:

s3 = Aws::S3::Client.new(endpoint:'https://s3-ap-southeast-1.amazonaws.com')

请参阅。

如果有人在寻找此功能,下面是根据


可能repost@sgud不对,您提供的链接是关于AWS-S3 gem的,它具有不同的语法-替换类的常量“my_folder”是对象名称的一部分,而不是Bucket@mikhailov事实确实如此,它是对象名称的一部分。你能回答这个问题吗?干杯@Godsaur完成了,请在下面查看这对我有用:
s3=Aws::s3::Client.new(端点:'https://s3-ap-southeast-1.amazonaws.com)
s3=Aws::s3::Client.new(region:'eu-west-1')
似乎是最新版本
http://s3.amazon.com/bucket/name/path/to/object.txt
# 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
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'
s3 = Aws::S3::Client.new(endpoint:'https://s3-ap-southeast-1.amazonaws.com')
creds = JSON.load(File.read('secrets.json'))
Aws.config[:credentials] = Aws::Credentials.new(creds['AccessKeyId'], creds['SecretAccessKey'])
Aws.config[:region] = 'us-east-1'

client = Aws::S3::Client.new(
    region: Aws.config[:region],
    credentials: Aws.config[:credentials]
)

File.open('/local_directory/picture.jpg', 'rb') do |file|
  client.put_object(bucket: 'bucket', key: 'folder_inside_bucket/picture.jpg', body: file)
end