【问题标题】:How to copy list of public S3 files to private S3 bucket如何将公共 S3 文件列表复制到私有 S3 存储桶
【发布时间】:2016-10-18 18:57:30
【问题描述】:

在 Rails 中,使用 aws-sdk gem(比如 5k 个文件),将托管在 S3(不是我的帐户)上的公共文件列表复制到我的私人存储桶中的最简单方法是什么?我想保留相同的文件和路径名。

例子:

http://target.com.s3.amazonaws.com/assets/videos/abc123.mp4 (public)

http://myexample.com.s3.amazonaws.com/assets/videos/abc123.mp4 (private)

我想将文件读入内存并直接流入 S3。我的托管服务提供商 (Heroku) 没有磁盘空间。这些文件是 MP4,大小约为 3-4MB。

这是我的方法(未经测试):

vid_file = 'http://example.com.s3.amazonaws.com/assets/videos/abc123.mp4'
vid_response = HTTParty.get(vid_file)

if vid_response.code == 200

  filename = File.basename(vid_file) # TOOD - fix to include s3 folder before object filename

  s3 = Aws::S3::Resource.new(region: ENV['AWS_REGION'])
  obj = s3.bucket(ENV['S3_BUCKET']).object(filename)
  obj.put(body: vid_response.body)
end

但是,尽管我没有第一个存储桶的密钥(但对象是公共的),但开发工具包是否可以指示 AWS 在 S3 存储桶之间执行内部复制?如果不是,我的上述方法是否正确(流入内存,发布到 S3)?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 amazon-s3


    【解决方案1】:

    如果您知道文件名模式,一个简单的解决方案是使用 wget 之类的东西,然后使用 ruby​​ s3 客户端上传到您的私有存储桶。我理解你为什么要使用内存而不是硬盘,但老实说假设你有几个免费的演出,你的互联网连接可能是瓶颈。

    【讨论】:

    • 我更新了我的问题。看看 - 让我知道你的想法。
    【解决方案2】:

    1) 没有用于将公共 S3 对象“内部复制”到私有 S3 存储桶的 sdk 功能。

    2) 以下源代码有效,它保持相同的 S3 目录结构

    vid_file = 'http://example.com.s3.amazonaws.com/assets/videos/abc123.mp4'
    vid_response = HTTParty.get(vid_file)
    
    if vid_response.code == 200
    
      uri_path = URI(vid_url).path 
      uri_path.slice!(0) # slice!(0) removes leading slash, otherwise creates an empty s3 folder
    
      s3 = Aws::S3::Resource.new(region: ENV['AWS_REGION'])
      obj = s3.bucket(ENV['S3_BUCKET']).object(uri_path)
      obj.put(body: vid_response.body) if !obj.exists?
    end
    

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 2019-08-07
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      相关资源
      最近更新 更多