Class: CarrierWave::Aliyun::Bucket

Inherits:
Object
  • Object
show all
Defined in:
lib/carrierwave/aliyun/bucket.rb

Constant Summary collapse

PATH_PREFIX =
%r{^/}.freeze
CHUNK_SIZE =
1024 * 1024

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(uploader) ⇒ Bucket

Returns a new instance of Bucket.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/carrierwave/aliyun/bucket.rb', line 12

def initialize(uploader)
  if uploader.aliyun_area.present?
    ActiveSupport::Deprecation.warn("config.aliyun_area will deprecation in carrierwave-aliyun 1.1.0, please use `aliyun_region` instead.")
    uploader.aliyun_region ||= uploader.aliyun_area
  end

  unless uploader.aliyun_private_read.nil?
    ActiveSupport::Deprecation.warn(%(config.aliyun_private_read will deprecation in carrierwave-aliyun 1.1.0, please use `aliyun_mode = :private` instead.))
    uploader.aliyun_mode ||= uploader.aliyun_private_read ? :private : :public
  end

  if uploader.aliyun_access_id.present?
    ActiveSupport::Deprecation.warn(%(config.aliyun_access_id will deprecation in carrierwave-aliyun 1.1.0, please use `aliyun_access_key_id` instead.))
    uploader.aliyun_access_key_id ||= uploader.aliyun_access_id
  end

  if uploader.aliyun_access_key.present?
    ActiveSupport::Deprecation.warn(%(config.aliyun_access_key will deprecation in carrierwave-aliyun 1.1.0, please use `aliyun_access_key_secret` instead.))
    uploader.aliyun_access_key_secret ||= uploader.aliyun_access_key
  end

  @access_key_id     = uploader.aliyun_access_key_id
  @access_key_secret = uploader.aliyun_access_key_secret
  @bucket            = uploader.aliyun_bucket
  @region            = uploader.aliyun_region || "cn-hangzhou"
  @mode              = (uploader.aliyun_mode || :public).to_sym

  # Host for get request
  @endpoint = "https://#{bucket}.oss-#{region}.aliyuncs.com"
  @host = uploader.aliyun_host || @endpoint

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

  @get_endpoint = "https://oss-#{region}.aliyuncs.com"
  @upload_endpoint = uploader.aliyun_internal == true ? "https://oss-#{region}-internal.aliyuncs.com" : "https://oss-#{region}.aliyuncs.com"
end

Instance Attribute Details

#access_key_idObject (readonly)

Returns the value of attribute access_key_id.



9
10
11
# File 'lib/carrierwave/aliyun/bucket.rb', line 9

def access_key_id
  @access_key_id
end

#access_key_secretObject (readonly)

Returns the value of attribute access_key_secret.



9
10
11
# File 'lib/carrierwave/aliyun/bucket.rb', line 9

def access_key_secret
  @access_key_secret
end

#bucketObject (readonly)

Returns the value of attribute bucket.



9
10
11
# File 'lib/carrierwave/aliyun/bucket.rb', line 9

def bucket
  @bucket
end

#endpointObject (readonly)

Returns the value of attribute endpoint.



9
10
11
# File 'lib/carrierwave/aliyun/bucket.rb', line 9

def endpoint
  @endpoint
end

#get_endpointObject (readonly)

Returns the value of attribute get_endpoint.



9
10
11
# File 'lib/carrierwave/aliyun/bucket.rb', line 9

def get_endpoint
  @get_endpoint
end

#hostObject (readonly)

Returns the value of attribute host.



9
10
11
# File 'lib/carrierwave/aliyun/bucket.rb', line 9

def host
  @host
end

#modeObject (readonly)

Returns the value of attribute mode.



9
10
11
# File 'lib/carrierwave/aliyun/bucket.rb', line 9

def mode
  @mode
end

#regionObject (readonly)

Returns the value of attribute region.



9
10
11
# File 'lib/carrierwave/aliyun/bucket.rb', line 9

def region
  @region
end

#upload_endpointObject (readonly)

Returns the value of attribute upload_endpoint.



9
10
11
# File 'lib/carrierwave/aliyun/bucket.rb', line 9

def upload_endpoint
  @upload_endpoint
end

Instance Method Details

#copy_object(source, dest) ⇒ Object



77
78
79
80
81
82
# File 'lib/carrierwave/aliyun/bucket.rb', line 77

def copy_object(source, dest)
  source = source.sub(PATH_PREFIX, "")
  dest = dest.sub(PATH_PREFIX, "")

  oss_upload_client.copy_object(source, dest)
end

#delete(path) ⇒ Object

删除 Remote 的文件

params:

  • path - remote 存储路径

returns: 图片的下载地址



108
109
110
111
112
113
114
# File 'lib/carrierwave/aliyun/bucket.rb', line 108

def delete(path)
  path = path.sub(PATH_PREFIX, "")
  oss_upload_client.delete_object(path)
  path_to_url(path)
rescue StandardError => e
  raise "Delete failed: #{e}"
end

#get(path) ⇒ Object

读取文件 params:

  • path - remote 存储路径

returns: file data



89
90
91
92
93
94
95
96
97
98
99
# File 'lib/carrierwave/aliyun/bucket.rb', line 89

def get(path)
  path = path.sub(PATH_PREFIX, "")
  chunk_buff = []
  obj = oss_upload_client.get_object(path) do |chunk|
    chunk_buff << chunk
  end

  [obj, chunk_buff.join("")]
rescue StandardError => e
  raise "Get content faild: #{e}"
end

#get_url(path, private: false, thumb: nil) ⇒ Object



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/carrierwave/aliyun/bucket.rb', line 128

def get_url(path, private: false, thumb: nil)
  path = path.sub(PATH_PREFIX, "")

  url = if thumb&.start_with?("?")
          # foo.jpg?x-oss-process=image/resize,h_100
          parameters = { "x-oss-process" => thumb.split("=").last }
          oss_client.object_url(path, private, 15.minutes, parameters)
        else
          oss_client.object_url(path, private, 15.minutes)
        end

  url = [url, thumb].join("") if !private && !thumb&.start_with?("?")

  url.sub(endpoint, host)
end

#head(path) ⇒ Object



144
145
146
147
# File 'lib/carrierwave/aliyun/bucket.rb', line 144

def head(path)
  path = path.sub(PATH_PREFIX, "")
  oss_upload_client.get_object(path)
end

#list_objects(opts = {}) ⇒ Object

list_objects for test



150
151
152
# File 'lib/carrierwave/aliyun/bucket.rb', line 150

def list_objects(opts = {})
  oss_client.list_objects(opts)
end

#path_to_url(path, thumb: nil) ⇒ Object

根据配置返回完整的上传文件的访问地址



118
119
120
# File 'lib/carrierwave/aliyun/bucket.rb', line 118

def path_to_url(path, thumb: nil)
  get_url(path, thumb: thumb)
end

#private_get_url(path, thumb: nil) ⇒ Object

私有空间访问地址,会带上实时算出的 token 信息 有效期 15 minutes



124
125
126
# File 'lib/carrierwave/aliyun/bucket.rb', line 124

def private_get_url(path, thumb: nil)
  get_url(path, private: true, thumb: thumb)
end

#put(path, file, content_type: "image/jpg", content_disposition: nil) ⇒ Object

上传文件 params:

  • path - remote 存储路径

  • file - 需要上传文件的 File 对象

  • opts:

    • content_type - 上传文件的 MimeType,默认 ‘image/jpg`

    • content_disposition - Content-Disposition

returns: 图片的下载地址



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/carrierwave/aliyun/bucket.rb', line 60

def put(path, file, content_type: "image/jpg", content_disposition: nil)
  path = path.sub(PATH_PREFIX, "")

  headers = {}
  headers["Content-Type"] = content_type
  headers["Content-Disposition"] = content_disposition if content_disposition

  begin
    oss_upload_client.put_object(path, headers: headers) do |stream|
      stream << file.read(CHUNK_SIZE) until file.eof?
    end
    path_to_url(path)
  rescue StandardError => e
    raise "Put file failed: #{e}"
  end
end