ruby on rails爬坑(四):使用AWS S3存取数据

  • Post author:
  • Post category:其他

一,前言

在上一篇博客ruby on rails爬坑(三):图片上传及显示中提到AWS S3,这篇博客将简单介绍如何在rails项目中使用AWS S3.

二,步骤

  • 在亚马逊云服务中心开通配置AWS S3服务
  • 在Gemfile中添加aws-sdk

    gem 'aws-sdk', '~> 2'
  • 在config/initializers文件夹下新建aws.rb(initializers文件夹下的内容在程序启动时会被自动调用),用于在全局初始化S3_BUCKET,一处配置,各处使用,内容如下:

    region = "your region name"
    accessKeyID = "your keyID" 
    secretKey = "your key"
    bucket = "your bucket name"
    
    Aws.config.update({
      region: region,
      credentials: Aws::Credentials.new(accessKeyID, secretKey),
    })
    
    S3_BUCKET = Aws::S3::Resource.new.bucket(bucket)
  • 上传测试: 尝试上传一首歌

    
    #url:文件的本地路径
    
    def upload_mp3(url)
        md5 = Digest::MD5.hexdigest(url)
    
        file = Tempfile.new([md5, '.mp3'])
        file.binmode
        open(URI.parse(url)) do |data|
          file.write data.read
        end
        file.rewind
    
        key = "#{Time.now.strftime("%Y/%m%d")}/#{md5}.mp3"
    
        obj = S3_BUCKET.object("audio/#{key}")  #使用之前配置好的S3_BUCKET
        obj.upload_file(file, {
          :content_type => "audio/mpeg",
          :cache_control => "max-age=604800",
          :acl => "public-read"
        })
        return obj.public_url  #返回S3中该文件的地址,供我们下载使用
    end
  • 下载测试: region-name, bucket-name分别与上文配置的region, bucket对应,object-key与上文上传测试中指定的key对应。

    s3 = Aws::S3::Client.new(region: 'region-name')
    resp = s3.get_object(bucket:'bucket-name', key:'object-key')
    
    resp.body
    
    #=> #<StringIO ...> 
    
    
    resp.body.read
    
    #=> '...'
    

三,补充

两篇关于上传和下载的官方博客:

至于S3更详细的内容,请查阅官方文档, 我正好用到上传下载,学得比较浅,有纰漏望指出。


版权声明:本文为code_for_free原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。