class CarrierWave::Ucloud::Bucket

Constants

PATH_PREFIX

Public Class Methods

new(uploader) click to toggle source
# File lib/carrierwave/ucloud/bucket.rb, line 10
def initialize(uploader)
  @ucloud_public_key             = uploader.ucloud_public_key
  @ucloud_private_key            = uploader.ucloud_private_key
  @ucloud_public_read            = uploader.ucloud_public_read
  @ucloud_bucket                 = @ucloud_public_read ? uploader.ucloud_public_bucket : uploader.ucloud_private_bucket
  @ucloud_bucket_host            = @ucloud_public_read ? uploader.ucloud_public_bucket_host : uploader.ucloud_private_bucket_host
  @ucloud_cdn_host               = @ucloud_public_read ? uploader.ucloud_public_cdn_host : uploader.ucloud_private_cdn_host
  @ucloud_private_expire_seconds = uploader.ucloud_private_expire_seconds || 300

  unless @ucloud_cdn_host.include?('//')
    raise "config.ucloud_cdn_host requirement include // http:// or https://, but you give: #{@ucloud_cdn_host}"
  end
end

Public Instance Methods

delete(path) click to toggle source

删除文件 @return [Boolean]

# File lib/carrierwave/ucloud/bucket.rb, line 55
def delete(path)
  path.sub!(PATH_PREFIX, '')
  response = conn.delete(url(path)) do |req|
    req.headers['Authorization'] = authorization(req.method, nil, path)
  end

  response.success?
end
exists?(path) click to toggle source

查看文件是否存在(head response 200) @return [Boolean]

# File lib/carrierwave/ucloud/bucket.rb, line 66
def exists?(path)
  path.sub!(PATH_PREFIX, '')
  response = conn.head(url(path)) do |req|
    req.headers['Authorization'] = authorization(req.method, nil, path)
  end

  response.success?
end
get(path) click to toggle source

读取文件

# File lib/carrierwave/ucloud/bucket.rb, line 42
def get(path)
  path.sub!(PATH_PREFIX, '')
  response = conn.get(url(path))

  if response.success?
    return response
  else
    raise 'Ucloud Get File Fail'
  end
end
private_get_url(path) click to toggle source

私有空间访问地址

# File lib/carrierwave/ucloud/bucket.rb, line 90
def private_get_url(path)
  public_get_url(path) + privite_get_url_auth(path)
end
public_get_url(path) click to toggle source

公开的访问地址

# File lib/carrierwave/ucloud/bucket.rb, line 84
def public_get_url(path)
  path.sub!(PATH_PREFIX, '')
  [@ucloud_cdn_host, path].join('/')
end
put(path, file, headers = {}) click to toggle source

上传文件

# File lib/carrierwave/ucloud/bucket.rb, line 25
def put(path, file, headers = {})
  path.sub!(PATH_PREFIX, '')

  response = conn.put(path, file.read) do |req|
    req.headers = headers
    token = authorization(req.method, headers['Content-Type'], path)
    req.headers['Authorization'] = token
  end

  if response.success?
    true
  else
    raise 'Ucloud上传失败'
  end
end
url(path) click to toggle source
# File lib/carrierwave/ucloud/bucket.rb, line 75
def url(path)
  if @ucloud_public_read
    public_get_url(path)
  else
    private_get_url(path)
  end
end

Private Instance Methods

authorization(http_method, content_type, path) click to toggle source
# File lib/carrierwave/ucloud/bucket.rb, line 116
def authorization(http_method, content_type, path)
  signed_str = signature(string_to_sign(http_method, content_type, path))
  "UCloud " + @ucloud_public_key + ":" + signed_str
end
conn() click to toggle source
# File lib/carrierwave/ucloud/bucket.rb, line 96
def conn
  @conn ||= begin
    Faraday.new(url: @ucloud_bucket_host) do |req|
      req.request :url_encoded
      req.adapter Faraday.default_adapter
    end
  end
end
private_expire_ts() click to toggle source
# File lib/carrierwave/ucloud/bucket.rb, line 112
def private_expire_ts
  @ucloud_private_expire_seconds + Time.now.to_i
end
privite_get_url_auth(path) click to toggle source

私密查看url的认证信息

# File lib/carrierwave/ucloud/bucket.rb, line 106
def privite_get_url_auth(path)
  expired_ts = private_expire_ts
  signed_str = signature(string_to_sign('GET', nil, path, expired_ts))
  "?UCloudPublicKey=#{@ucloud_public_key}&Expires=#{expired_ts}&Signature=#{signed_str}"
end
signature(str) click to toggle source
# File lib/carrierwave/ucloud/bucket.rb, line 121
def signature(str)
  Base64.strict_encode64(OpenSSL::HMAC.digest('sha1', @ucloud_private_key, str))
end
string_to_sign(http_method, ori_content_type, path, expired_ts = nil) click to toggle source
# File lib/carrierwave/ucloud/bucket.rb, line 125
def string_to_sign(http_method, ori_content_type, path, expired_ts = nil)
  http_verb = "#{http_method.upcase}\n"
  content_md5 = "\n"
  content_type = "#{ori_content_type}\n"
  timestamp = "#{expired_ts}\n"
  full_path = "/#{@ucloud_bucket}/#{path}"
  http_verb + content_md5 + content_type + timestamp + full_path
end