Ruby 十几行代码实现阿里云 OSS 上传

est · 2015年04月29日 · 最后由 rockuw 回复于 2015年12月05日 · 3984 次阅读

出于这个帖子的 https://ruby-china.org/topics/25352

原始需求不太一样,我写这个函数目的是为了实现服务器给远程文件签名,客户端/浏览器直接上传,无需经过服务器中转。

实现 代码有删改,没测试过,大概思路如下:

def aliyun_oss file_name
  key, secret = 'YOUR_ALIYUN_KEY', 'YOUR_ALIYUN_SECRET'
  bucket_name = 'YOUR_OSS_BUCKET'
  date_str = Time.now.utc.strftime '%a, %d %b %Y %H:%M:%S GMT'

  path = "YOUR_WHATEVER_PREFIX/#{file_name}"
  signature = "PUT\n\n\n#{date_str}\n/#{bucket_name}/#{path}"
  token_b64 = Base64.encode64(
    Digest::HMAC.digest(signature, secret, Digest::SHA1)
  ).strip
 return {Authorization: 'OSS %s:%s' % [key, token_b64], Date: date_str}
end

然后用你喜欢的 http 工具 PUT 原始文件内容到 "http://#{bucket_name}.oss.aliyuncs.com/YOUR_WHATEVER_PREFIX/#{file_name}" 即可。其中 http 请求头需要加上 Authorization 这个字段。

我在服务器端的的实现之一是直接 nohup 一个 curl。免除了 sidekiq 的麻烦。还能失败了自动重传。

有人问:为什么不用 X 库的 Y 方法呢?我的回答是:懒得增加额外的依赖了。

可以试试官方的 ruby sdk:https://github.com/aliyun/aliyun-oss-ruby-sdk

bucket.put_object('key', :file => '/tmp/x')
bucket.get_object('key', :file => '/tmp/y)
需要 登录 后方可回复, 如果你还没有账号请 注册新账号