carrierwave-aliyun 1.1.2 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 83e7828d8abba5ebf25ae01f845bf0695e596c432b9b867a42034454f5862058
4
- data.tar.gz: 106b6e3372acfe88f89cf0c00346ba5d8ec33f97deb10077d07ee943d7b514ee
3
+ metadata.gz: fd2862b19f1414efc11faf608fba6ecc0ac6a8048dd86d96cdf3ffa4b7ad3c7f
4
+ data.tar.gz: 031b8b1ad35539a5605abae8cebbb17b0b393d68cb4442d00ca1a3b2a97491c3
5
5
  SHA512:
6
- metadata.gz: ed4defc5158003da256b08bf9c13d798abab8f684fa8ccec4363438840f2ba12ab603115103396634764a127acece35779ba18e6704525ce24f6a98bf81bc33d
7
- data.tar.gz: d23cb3be191b8feb7e9906589bdbe3833a204402e7961fc9f14f672de3e52cf1273a1cff05fae5136339aff2ec1a40946354acce402cb1f828d803628e5b4b4a
6
+ metadata.gz: 6d115a0e6cc1a3262a40a9f5a0a525249fef749e690d5ab7d8aeace8cb9a084881b20d6b0541833ac4c0dc0c47868b0e3805432cd31ff04044763f2b2f084160
7
+ data.tar.gz: d5c5f5ebb6567b441a73412b8670d73f6e0e9a67f867caeabdeea430d14e990e3f3ef7c5644ead6ae892c45feb891f62ed24e5766868381d056444ee6ab2f055
@@ -1,3 +1,27 @@
1
+ ## 1.2.3
2
+
3
+ - 将 Aliyun::OSS 原本的异常原样抛出;
4
+ - 验证对 [传输加速](https://help.aliyun.com/document_detail/131312.html) 的能力,并增加文档说明(实际上之前的版本就支持)。
5
+
6
+ ## 1.2.2
7
+
8
+ - 修正 #79 某些场景中文文件名无法正确上传的问题;
9
+ - 修正 #70 上传文件以后 tmp 目录依然还残留着 cache 文件的问题;
10
+
11
+ ## 1.2.1
12
+
13
+ - 实现 `size` 方法,修正更新图片数组时,新上传的图片会取代旧图片的问题。(#73)
14
+
15
+ ## 1.2.0
16
+
17
+ - 整理修复 OSS 文件访问 URL 的生成方式,去掉 img host,保持和最新 OSS API 一样的逻辑。
18
+ - 生成 URL 的时候,不再强制替换为 https,保持 `aliyun_host` 的配置;
19
+
20
+ ## 1.1.2
21
+
22
+ - 修正 aliyun-sdk 0.7.0 以上 Thumb URL 生成的支持;
23
+ - Requirement aliyun-sdk >= 0.7.0;
24
+
1
25
  ## 1.1.2
2
26
 
3
27
  - 修正废弃调用方式,避免在 Ruby 2.7 里面出现 warning.
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  This gem adds support for [Aliyun OSS](http://oss.aliyun.com) to [CarrierWave](https://github.com/jnicklas/carrierwave/)
4
4
 
5
- [![Gem Version](https://badge.fury.io/rb/carrierwave-aliyun.svg)](https://rubygems.org/gems/carrierwave-aliyun) [![Build Status](https://travis-ci.org/huacnlee/carrierwave-aliyun.svg?branch=master)](https://travis-ci.org/huacnlee/carrierwave-aliyun) [![Code Climate](https://codeclimate.com/github/huacnlee/carrierwave-aliyun/badges/gpa.svg)](https://codeclimate.com/github/huacnlee/carrierwave-aliyun)
5
+ [![Gem Version](https://badge.fury.io/rb/carrierwave-aliyun.svg)](https://rubygems.org/gems/carrierwave-aliyun) [![build](https://github.com/huacnlee/carrierwave-aliyun/workflows/build/badge.svg)](https://github.com/huacnlee/carrierwave-aliyun/actions?query=workflow%3Abuild)
6
6
 
7
7
  > NOTE: 此 Gem 是一个 CarrierWave 的组件,你需要配合 CarrierWave 一起使用,如果你需要直接用 Aliyun OSS,可以尝试用 [aliyun-sdk](https://github.com/aliyun/aliyun-oss-ruby-sdk) 这个 Gem。
8
8
 
@@ -80,3 +80,20 @@ class AttachmentUploader < CarrierWave::Uploader::Base
80
80
  end
81
81
  end
82
82
  ```
83
+
84
+ ## 启用全球传输加速
85
+
86
+ 阿里云允许我们通过 `oss-accelerate.aliyuncs.com` 的节点来实现全球的传输加速,如果你的需要在境外的服务器传输到国内,或许需要开启这个功能。
87
+
88
+ 你只需要将 CarrierWave Aliyun 的 `aliyun_region` 配置为 `accelerate` 即可。
89
+
90
+ ```rb
91
+ config.aliyun_region = "accelerate"
92
+ ```
93
+
94
+ ### 异常解析
95
+
96
+ > 错误:OSS Transfer Acceleration is not configured on this bucket.
97
+ > 确保有开启 [传输加速](https://help.aliyun.com/document_detail/131312.html),进入 Bucket / 传输管理 / 传输加速 / 开启传输加速。
98
+
99
+ 额外注意:Aliyun OSS 开启传输加速后需要 **30 分钟内全网生效**
@@ -3,12 +3,11 @@
3
3
  module CarrierWave
4
4
  module Aliyun
5
5
  class Bucket
6
- PATH_PREFIX = %r{^/}
6
+ PATH_PREFIX = %r{^/}.freeze
7
7
  CHUNK_SIZE = 1024 * 1024
8
8
 
9
- attr_reader :access_key_id, :access_key_secret, :bucket, :region, :mode, :host
10
-
11
- attr_reader :endpoint, :img_endpoint, :upload_endpoint
9
+ attr_reader :access_key_id, :access_key_secret, :bucket, :region, :mode, :host, :endpoint, :upload_endpoint,
10
+ :get_endpoint
12
11
 
13
12
  def initialize(uploader)
14
13
  if uploader.aliyun_area.present?
@@ -16,7 +15,7 @@ module CarrierWave
16
15
  uploader.aliyun_region ||= uploader.aliyun_area
17
16
  end
18
17
 
19
- if uploader.aliyun_private_read != nil
18
+ unless uploader.aliyun_private_read.nil?
20
19
  ActiveSupport::Deprecation.warn(%(config.aliyun_private_read will deprecation in carrierwave-aliyun 1.1.0, please use `aliyun_mode = :private` instead.))
21
20
  uploader.aliyun_mode ||= uploader.aliyun_private_read ? :private : :public
22
21
  end
@@ -38,15 +37,15 @@ module CarrierWave
38
37
  @mode = (uploader.aliyun_mode || :public).to_sym
39
38
 
40
39
  # Host for get request
41
- @host = uploader.aliyun_host || "https://#{self.bucket}.oss-#{self.region}.aliyuncs.com"
40
+ @endpoint = "https://#{bucket}.oss-#{region}.aliyuncs.com"
41
+ @host = uploader.aliyun_host || @endpoint
42
42
 
43
43
  unless @host.include?("//")
44
- raise "config.aliyun_host requirement include // http:// or https://, but you give: #{self.host}"
44
+ raise "config.aliyun_host requirement include // http:// or https://, but you give: #{host}"
45
45
  end
46
46
 
47
- @endpoint = "https://oss-#{self.region}.aliyuncs.com"
48
- @upload_endpoint = uploader.aliyun_internal == true ? "https://oss-#{self.region}-internal.aliyuncs.com" : @endpoint
49
- @img_endpoint = "https://img-#{self.region}.aliyuncs.com"
47
+ @get_endpoint = "https://oss-#{region}.aliyuncs.com"
48
+ @upload_endpoint = uploader.aliyun_internal == true ? "https://oss-#{region}-internal.aliyuncs.com" : "https://oss-#{region}.aliyuncs.com"
50
49
  end
51
50
 
52
51
  # 上传文件
@@ -65,14 +64,10 @@ module CarrierWave
65
64
  headers["Content-Type"] = content_type
66
65
  headers["Content-Disposition"] = content_disposition if content_disposition
67
66
 
68
- begin
69
- oss_upload_client.put_object(path, headers: headers) do |stream|
70
- stream << file.read(CHUNK_SIZE) until file.eof?
71
- end
72
- path_to_url(path)
73
- rescue => e
74
- raise "Put file failed: #{e}"
67
+ oss_upload_client.put_object(path, headers: headers) do |stream|
68
+ stream << file.read(CHUNK_SIZE) until file.eof?
75
69
  end
70
+ path_to_url(path)
76
71
  end
77
72
 
78
73
  def copy_object(source, dest)
@@ -95,8 +90,6 @@ module CarrierWave
95
90
  end
96
91
 
97
92
  [obj, chunk_buff.join("")]
98
- rescue => e
99
- raise "Get content faild: #{e}"
100
93
  end
101
94
 
102
95
  # 删除 Remote 的文件
@@ -110,34 +103,34 @@ module CarrierWave
110
103
  path = path.sub(PATH_PREFIX, "")
111
104
  oss_upload_client.delete_object(path)
112
105
  path_to_url(path)
113
- rescue => e
114
- raise "Delete failed: #{e}"
115
106
  end
116
107
 
117
108
  ##
118
109
  # 根据配置返回完整的上传文件的访问地址
119
110
  def path_to_url(path, thumb: nil)
120
- path = path.sub(PATH_PREFIX, "")
121
-
122
- if thumb
123
- [self.host, [path, thumb].join("")].join("/")
124
- else
125
- [self.host, path].join("/")
126
- end
111
+ get_url(path, thumb: thumb)
127
112
  end
128
113
 
129
114
  # 私有空间访问地址,会带上实时算出的 token 信息
130
115
  # 有效期 15 minutes
131
116
  def private_get_url(path, thumb: nil)
117
+ get_url(path, private: true, thumb: thumb)
118
+ end
119
+
120
+ def get_url(path, private: false, thumb: nil)
132
121
  path = path.sub(PATH_PREFIX, "")
133
122
 
134
- url = if thumb
135
- img_client.object_url([path, thumb].join(""), expiry: 15.minutes)
123
+ url = if thumb&.start_with?("?")
124
+ # foo.jpg?x-oss-process=image/resize,h_100
125
+ parameters = { "x-oss-process" => thumb.split("=").last }
126
+ oss_client.object_url(path, private, 15.minutes, parameters)
136
127
  else
137
- oss_client.object_url(path, expiry: 15.minutes)
128
+ oss_client.object_url(path, private, 15.minutes)
138
129
  end
139
130
 
140
- url.sub("http://", "https://")
131
+ url = [url, thumb].join("") if !private && !thumb&.start_with?("?")
132
+
133
+ url.sub(endpoint, host)
141
134
  end
142
135
 
143
136
  def head(path)
@@ -145,28 +138,28 @@ module CarrierWave
145
138
  oss_upload_client.get_object(path)
146
139
  end
147
140
 
141
+ # list_objects for test
142
+ def list_objects(opts = {})
143
+ oss_client.list_objects(opts)
144
+ end
145
+
148
146
  private
149
147
 
150
- def oss_client
151
- return @oss_client if defined?(@oss_client)
152
- client = ::Aliyun::OSS::Client.new(endpoint: self.endpoint,
153
- access_key_id: self.access_key_id, access_key_secret: self.access_key_secret)
154
- @oss_client = client.get_bucket(self.bucket)
155
- end
148
+ def oss_client
149
+ return @oss_client if defined?(@oss_client)
156
150
 
157
- def img_client
158
- return @img_client if defined?(@img_client)
159
- client = ::Aliyun::OSS::Client.new(endpoint: self.img_endpoint,
160
- access_key_id: self.access_key_id, access_key_secret: self.access_key_secret)
161
- @img_client = client.get_bucket(self.bucket)
162
- end
151
+ client = ::Aliyun::OSS::Client.new(endpoint: get_endpoint, access_key_id: access_key_id,
152
+ access_key_secret: access_key_secret)
153
+ @oss_client = client.get_bucket(bucket)
154
+ end
163
155
 
164
- def oss_upload_client
165
- return @oss_upload_client if defined?(@oss_upload_client)
166
- client = ::Aliyun::OSS::Client.new(endpoint: self.upload_endpoint,
167
- access_key_id: self.access_key_id, access_key_secret: self.access_key_secret)
168
- @oss_upload_client = client.get_bucket(self.bucket)
169
- end
156
+ def oss_upload_client
157
+ return @oss_upload_client if defined?(@oss_upload_client)
158
+
159
+ client = ::Aliyun::OSS::Client.new(endpoint: upload_endpoint, access_key_id: access_key_id,
160
+ access_key_secret: access_key_secret)
161
+ @oss_upload_client = client.get_bucket(bucket)
162
+ end
170
163
  end
171
164
  end
172
165
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module CarrierWave
4
4
  module Aliyun
5
- VERSION = "1.1.2"
5
+ VERSION = "1.2.3"
6
6
  end
7
7
  end
@@ -37,22 +37,11 @@ module CarrierWave
37
37
  # do nothing, because there's no such things as 'empty directory'
38
38
  end
39
39
 
40
- def clean_cache!(_seconds)
41
- will_remove_keys = []
42
- bucket.list_objects(prefix: uploader.cache_path).each do |file|
43
- next unless file.is_a?(Object)
44
- time = file.key.scan(/(\d+)-\d+-\d+(?:-\d+)?/).first.map { |t| t.to_i }
45
- time = Time.at(*time)
46
- will_remove_keys << item.key if time < (Time.now.utc - seconds)
47
- end
48
- bucket.batch_delete_objects(will_remove_keys)
49
- end
50
-
51
40
  private
52
41
 
53
- def bucket
54
- @bucket ||= CarrierWave::Aliyun::Bucket.new(uploader)
55
- end
42
+ def bucket
43
+ @bucket ||= CarrierWave::Aliyun::Bucket.new(uploader)
44
+ end
56
45
  end
57
46
  end
58
47
  end
@@ -3,17 +3,26 @@
3
3
  module CarrierWave
4
4
  module Storage
5
5
  class AliyunFile
6
+ attr_writer :file
6
7
  attr_reader :uploader, :path
7
8
 
8
- alias_method :filename, :path
9
- alias_method :identifier, :filename
9
+ alias filename path
10
+ alias identifier filename
10
11
 
11
12
  def initialize(uploader, base, path)
12
- @uploader, @path, @base = uploader, escape(path), base
13
+ @uploader = uploader
14
+ @path = path
15
+ @base = base
13
16
  end
14
17
 
15
- def escape(path)
16
- CGI.escape(path).gsub("%2F", "/")
18
+ def file
19
+ @file ||= bucket.get(path).try(:first)
20
+ end
21
+
22
+ def size
23
+ file.headers[:content_length].to_i
24
+ rescue StandardError
25
+ nil
17
26
  end
18
27
 
19
28
  def read
@@ -25,7 +34,7 @@ module CarrierWave
25
34
  def delete
26
35
  bucket.delete(path)
27
36
  true
28
- rescue => e
37
+ rescue StandardError => e
29
38
  # If the file's not there, don't panic
30
39
  puts "carrierwave-aliyun delete file failed: #{e}"
31
40
  nil
@@ -86,7 +95,8 @@ module CarrierWave
86
95
 
87
96
  def original_filename
88
97
  return @original_filename if @original_filename
89
- if @file && @file.respond_to?(:original_filename)
98
+
99
+ if @file&.respond_to?(:original_filename)
90
100
  @file.original_filename
91
101
  elsif path
92
102
  ::File.basename(path)
@@ -95,9 +105,9 @@ module CarrierWave
95
105
 
96
106
  private
97
107
 
98
- def bucket
99
- @bucket ||= CarrierWave::Aliyun::Bucket.new(uploader)
100
- end
108
+ def bucket
109
+ @bucket ||= CarrierWave::Aliyun::Bucket.new(uploader)
110
+ end
101
111
  end
102
112
  end
103
113
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carrierwave-aliyun
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Lee
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-27 00:00:00.000000000 Z
11
+ date: 2021-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: carrierwave
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.6.0
33
+ version: 0.7.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 0.6.0
40
+ version: 0.7.0
41
41
  description: Aliyun OSS support for Carrierwave
42
42
  email:
43
43
  - huacnlee@gmail.com
@@ -57,7 +57,7 @@ homepage: https://github.com/huacnlee/carrierwave-aliyun
57
57
  licenses:
58
58
  - MIT
59
59
  metadata: {}
60
- post_install_message:
60
+ post_install_message:
61
61
  rdoc_options: []
62
62
  require_paths:
63
63
  - lib
@@ -72,8 +72,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
72
  - !ruby/object:Gem::Version
73
73
  version: '0'
74
74
  requirements: []
75
- rubygems_version: 3.1.2
76
- signing_key:
75
+ rubygems_version: 3.2.3
76
+ signing_key:
77
77
  specification_version: 4
78
78
  summary: Aliyun OSS support for Carrierwave
79
79
  test_files: []