出于这个帖子的 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 方法呢?我的回答是:懒得增加额外的依赖了。