对象存储

  • 对象存储 > 使用指南 > 开发指南 > AWS S3 兼容 > 兼容 SDK 示例 > AWS SDK for Ruby

    AWS SDK for Ruby

    最近更新时间: 2024-02-19 17:03:42

    导入 AWS SDK for Ruby

    确保 Ruby v2.3 或更新版本已经安装。

    初始化 bundler 项目

    bundle init
    

    添加 AWS SDK for Ruby 包

    bundle add aws-sdk-s3 --version "=1.136.0"
    bundle add aws-sdk-sts --version "=1.11.0"
    bundle add nokogiri --version "=1.15.4"
    

    对于之后的每个代码示例,将代码创建在 main.rb 后,执行

    ruby main.rb
    

    即可执行代码。

    对象上传

    获取客户端上传 URL

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Resource::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    puts s3.bucket('<Bucket>').object('<Key>').presigned_url(:put)
    

    这段代码将生成一个经过预先签名的客户端上传 URL,有效期为 900 秒,客户端可以在过期时间内对该 URL 发送 HTTP PUT 请求将文件上传。

    以下是用 curl 上传文件的案例:

    curl -X PUT --upload-file "<path/to/file>" "<presigned url>"
    

    您也可以自行指定上传凭证的有效期,例如:

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Resource::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    puts s3.bucket('<Bucket>').object('<Key>').presigned_url(:put, expires_in: 3600)
    

    服务器端直传

    单请求上传(文件)

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Resource::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    open('<path/to/upload>', 'rb') do |file|
        resp = s3.put_object(bucket: '<Bucket>', key: '<Key>', body: file)
        puts resp[:etag]
    end
    

    单请求上传(数据流)

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Client::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    resp = s3.put_object(bucket: '<Bucket>', key: '<Key>', body: 'Hello from Qiniu S3!')
    puts resp[:etag]
    

    分片上传(文件)

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Client::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    create_multipart_upload_resp = s3.create_multipart_upload(bucket: '<Bucket>', key: '<Key>')
    
    PART_SIZE = 5 * 1024 * 1024 # 分片大小为 5 MB
    parts = []
    open('<path/to/upload>', 'rb') do |file|
        # 这里给出的案例是串行分片上传。可以自行改造成并行分片上传以进一步提升上传速度
        (1..).each do |part_number|
            part_body = file.read(PART_SIZE)
            break if part_body.nil?
            upload_part_response = s3.upload_part(
                bucket: create_multipart_upload_resp[:bucket],
                key: create_multipart_upload_resp[:key],
                upload_id: create_multipart_upload_resp[:upload_id],
                part_number: part_number,
                body: part_body,
            )
            parts << {etag: upload_part_response[:etag], part_number: part_number}
        end
    end
    
    complete_multipart_upload_response = s3.complete_multipart_upload(
        bucket: create_multipart_upload_resp[:bucket],
        key: create_multipart_upload_resp[:key],
        upload_id: create_multipart_upload_resp[:upload_id],
        multipart_upload: {parts: parts},
    )
    puts complete_multipart_upload_response[:etag]
    

    上传文件

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Resource::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    s3.bucket('<Bucket>').object('<Key>').upload_file('<path/to/upload>')
    puts 'Done'
    

    对象下载

    获取客户端下载 URL

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Resource::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    puts s3.bucket('<Bucket>').object('<Key>').presigned_url(:get)
    

    这段代码将生成一个经过预先签名的客户端下载 URL,有效期为 900 秒,客户端可以在过期时间内对该 URL 发送 HTTP GET 请求将文件下载。

    以下是用 curl 下载文件的案例:

    curl -o "<path/to/download>" "<presigned url>"
    

    您也可以自行指定下载凭证的有效期,例如:

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Resource::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    puts s3.bucket('<Bucket>').object('<Key>').presigned_url(:get, expires_in: 3600)
    

    服务器端直接下载

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Client::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    response = s3.get_object(bucket: '<Bucket>', key: '<Key>')
    puts response[:etag]
    

    下载文件

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Resource::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    s3.bucket('<Bucket>').object('<Key>').get(response_target: '<path/to/download>')
    puts 'Done'
    

    对象管理

    获取对象信息

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Client::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    response = s3.get_object(bucket: '<Bucket>', key: '<Key>')
    puts response[:etag]
    

    修改对象 MimeType

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Client::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    s3.copy_object(bucket: '<Bucket>', key: '<Key>', copy_source: '/<Bucket>/<Key>', metadata_directive: 'REPLACE', content_type: '<NewContentType>')
    puts 'Done'
    

    修改对象存储类型

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Client::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    s3.copy_object(bucket: '<Bucket>', key: '<Key>', copy_source: '/<Bucket>/<Key>', metadata_directive: 'REPLACE', storage_class: 'GLACIER')
    puts 'Done'
    

    复制对象副本

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Client::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    s3.copy_object(bucket: '<ToBucket>', key: '<ToKey>', copy_source: '/<FromBucket>/<FromKey>', metadata_directive: 'COPY')
    puts 'Done'
    

    复制对象副本(大于 5GB)

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Client::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    head_object_resp = s3.head_object(bucket: '<FromBucket>', key: '<FromKey>')
    create_multipart_upload_resp = s3.create_multipart_upload(bucket: '<ToBucket>', key: '<ToKey>')
    
    PART_SIZE = 5 * 1024 * 1024 # 分片大小为 5 MB
    copied = 0
    parts = []
    # 这里给出的案例是串行分片复制。可以自行改造成并行分片复制以进一步提升复制速度
    (1..).each do |part_number|
        break if head_object_resp[:content_length] <= copied
        part_size = [PART_SIZE, head_object_resp[:content_length] - copied].min
        upload_part_copy_response = s3.upload_part_copy(
            bucket: create_multipart_upload_resp[:bucket],
            key: create_multipart_upload_resp[:key],
            upload_id: create_multipart_upload_resp[:upload_id],
            part_number: part_number,
            copy_source: "/<FromBucket>/<FromKey>",
            copy_source_range: "bytes=#{copied}-#{copied+part_size-1}",
        )
        parts << {etag: upload_part_copy_response[:copy_part_result][:etag], part_number: part_number}
        copied += part_size
    end
    
    complete_multipart_upload_response = s3.complete_multipart_upload(
        bucket: create_multipart_upload_resp[:bucket],
        key: create_multipart_upload_resp[:key],
        upload_id: create_multipart_upload_resp[:upload_id],
        multipart_upload: {parts: parts},
    )
    puts complete_multipart_upload_response[:etag]
    

    删除空间中的文件

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Client::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    s3.delete_object(bucket: '<Bucket>', key: '<Key>')
    puts 'Done'
    

    获取指定前缀的文件列表

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Client::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    resp = s3.list_objects_v2(bucket: '<Bucket>', prefix: '<KeyPrefix>')
    resp[:contents].each do |object|
        puts "Key: #{object[:key]}"
        puts "ETag: #{object[:etag]}"
    end
    

    批量删除空间中的文件

    创建 main.rb

    require 'aws-sdk-s3'
    
    s3 = Aws::S3::Client::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    
    s3.delete_objects(bucket: '<Bucket>', delete: { objects: [{key: '<Key1>'}, {key: '<Key2>'}, {key: '<Key3>'}] })
    puts 'Done'
    

    临时安全凭证

    创建 main.rb

    require 'aws-sdk-s3'
    require 'aws-sdk-sts'
    
    sts = Aws::STS::Client::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new('<QiniuAccessKey>', '<QiniuSecretKey>'),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    get_federation_token_response = sts.get_federation_token({
        name: 'Bob',
        duration_seconds: 3600,
        policy: '{"Version":"2012-10-17","Statement":[{"Sid":"Stmt1","Effect":"Allow","Action":["*"],"Resource":["*"]}]}'
    })
    
    s3 = Aws::S3::Resource::new(
        region: 'cn-east-1', # 华东-浙江区 region id
        credentials: Aws::Credentials.new(
            get_federation_token_response.credentials.access_key_id,
            get_federation_token_response.credentials.secret_access_key,
            get_federation_token_response.credentials.session_token
        ),
        endpoint: 'https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint
    )
    # 可以使用这些临时凭证调用 S3 服务
    s3.buckets.each {|bucket| puts bucket.name}
    
    以上内容是否对您有帮助?
  • Qvm free helper
    Close