balloon 1.0.4 → 1.1.2

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: 4f3a8e6d749f97fb1346c381e9a2b241329040293ca3434f4110a7ebd6cf8da5
4
- data.tar.gz: 042a59b6c61e6ca9bd2fee71b8482e9b2cfdf36de5f5280f22667ae89a821d7b
3
+ metadata.gz: 89bc6b2f3af3d0f77235b2ca38bc17851f0a3850a4742d14dfb462d5d32fb11d
4
+ data.tar.gz: f110eedc9a0e2ba8dde12785401755c0b4f5e264c707a4184dd35ca1a0e88aee
5
5
  SHA512:
6
- metadata.gz: fc8f0ce282e7679621d14c9e8ed77cffc334052ad2bcce0de75587b35c546936744492cdf5ca703afc258a450f264ea185fa0acf7bccccc62737ba5628a15b00
7
- data.tar.gz: 6155240c457ae548c86d0361d1a80a70a0ab2c28032c86a15f328a1ee5f201a0430960325da287655b0a8e9a7a834beb48a53662eb423a2ceb46ed38b2fb4ca9
6
+ metadata.gz: 1228ab4477df6a100db7046cffb4436775e8f851db17009fdb18b90a645b4eeb2e7cdfc48cb6cdfaff32af44dc73f4c6ae33a4968b8cd0f583a622d715662097
7
+ data.tar.gz: 60473bbaf1ab5804eb39e23d6f2577fd475c445d82486605696e34b43026a67c5f5c7ab7cd05c04e1c646c51b9594daf28576b94d2336006bcda4c90d9477fd4
data/.gitignore CHANGED
@@ -8,3 +8,4 @@ spec/fixtures/tmp
8
8
  spec/fixtures/public
9
9
  spec/fixtures/cache
10
10
  spec/config/balloon.yml
11
+ examples/output
data/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  # Balloon
2
2
 
3
3
 
4
- Balloon是基于Ruby的图片上传插件, 并且可以完美配合Rails使用。
4
+ Balloon是基于mini_magick的Rails项目图片上传插件。
5
+
5
6
 
6
7
 
7
8
  ## 安装
@@ -25,30 +26,47 @@ Balloon是基于Ruby的图片上传插件, 并且可以完美配合Rails使用
25
26
 
26
27
  $ gem install balloon
27
28
 
29
+
30
+
28
31
  ## 单独使用
29
32
 
30
- ```
33
+ Class 例子
34
+
35
+ ```ruby
31
36
  require 'balloon'
32
37
 
33
38
  Balloon.configure do |config|
34
39
  config.store_storage = :file
40
+ config.root = "output"
35
41
  end
36
42
 
37
43
  class Upload < Balloon::Base
38
- uploader :avatar
39
- uploader_size t: "100x100"
40
- uploader_name_format
44
+ uploader :image
45
+ uploader_dir 'uploads'
46
+ uploader_mimetype_white %w[image/jpeg image/png image/gif image/webp]
47
+ uploader_name_format name: "output", format: "upcase" # 输出文件名
48
+ uploader_type_format 'webp' # ImageMagick支持的类型
49
+ uploader_size thumb: "100x100", small: "200x", medium: '500x>' # https://legacy.imagemagick.org/Usage/resize/
41
50
  end
51
+ ```
52
+
53
+ 文件上传
42
54
 
43
- file = File.new("file.jpg")
55
+ ````ruby
56
+ file = File.new("input.jpg")
57
+ upload = Upload.new(file)
44
58
 
45
- upload = Upload.new("file")
59
+ or
60
+
61
+ upload = Upload.new("input.jpg")
46
62
 
47
63
  upload.upload_store #上传图片
64
+ upload.image #获取图片上传信息
48
65
 
49
66
  upload.from_store(:t) #获得图片Path
67
+ ````
68
+
50
69
 
51
- ```
52
70
 
53
71
  ## 在Rails中使用
54
72
 
@@ -56,7 +74,7 @@ upload.from_store(:t) #获得图片Path
56
74
  在Rails应用程序中运行下述命令来完成Balloon插件的初始化
57
75
 
58
76
  $ rails g balloon:config
59
-
77
+
60
78
  在运行命令后, 会在config目录中生成一个balloon.yml配置文件
61
79
 
62
80
  ###### 默认生成balloon.yml文件
@@ -91,22 +109,7 @@ store_dir: 设置存储目录, 默认为主目录下的"public"目录
91
109
  cache_dir: "tmp" # 设置临时文件储存目录, 默认为主目录下的“tmp”目录
92
110
  ```
93
111
 
94
- ###### 在为model文件添加下列格式
95
-
96
- Mongomapper, Mongoid
97
112
 
98
- ```
99
- class Image
100
- include MongoMapper::Document
101
- include Balloon::Up
102
-
103
- uploader :image, :db
104
- uploader_size t: "45", s: "450", m: "770"
105
- uploader_dir "uploads/product"
106
- uploader_mimetype_white %w{image/jpeg image/png image/gif}
107
- uploader_name_format name: Proc.new{|p| p.id.to_s }
108
- end
109
- ```
110
113
 
111
114
  model 配置介绍
112
115
 
@@ -123,7 +126,8 @@ uploader_name_format #对上传文件进行重命名,
123
126
  ```
124
127
 
125
128
 
126
- ActiveRecord
129
+
130
+ #### ActiveRecord
127
131
 
128
132
  先生成 model文件
129
133
 
@@ -131,16 +135,24 @@ ActiveRecord
131
135
 
132
136
  并修改migration文件, 为下列格式
133
137
 
134
- ```
138
+ ```ruby
135
139
 
136
140
  class CreateImages < ActiveRecord::Migration
137
141
  def change
138
142
  create_table :pictures do |t|
143
+ t.string :file_id, null: false, index: true
139
144
  t.string :file_name
145
+ t.integer :width
146
+ t.integer :height
140
147
  t.string :content_type
141
- t.integer :file_size
148
+ t.bigint :file_size
142
149
  t.string :storage
143
- t.datetime :created_at
150
+
151
+ # Postgresql 可以JSONB 作为metadata格式
152
+ t.jsonb :metadata
153
+ # Mysql和其它需要使用text
154
+ t.text :metadata
155
+
144
156
  t.timestamps
145
157
  end
146
158
  end
@@ -148,29 +160,73 @@ end
148
160
 
149
161
  ```
150
162
 
151
- model 文件
163
+ model 文件
152
164
 
153
- ```
154
- class Image < ActiveRecord::Base
165
+ ```ruby
166
+ class Picture < ActiveRecord::Base
155
167
  include Balloon::Up
156
168
 
157
- uploader :image
169
+ uploader :image, :db
170
+ uploader_dir 'uploads/images'
171
+ uploader_mimetype_white %w[image/jpeg image/png image/gif image/webp]
172
+ uploader_name_format name: proc { |img| img.file_id }
173
+ uploader_type_format 'webp'
174
+ uploader_size thumb: '150x', small: '450x>'
175
+
176
+ before_validation :create_file_id, on: :create
177
+
178
+ def create_file_id
179
+ self.file_id = generate_file_id
180
+ end
181
+
182
+ def generate_file_id
183
+ loop do
184
+ token = SecureRandom.hex
185
+ break token unless Picture.exists?(file_id: token)
186
+ end
187
+ end
158
188
  end
159
189
 
160
190
  ```
161
191
 
162
- ###### rails实现图片上传
192
+
193
+
194
+ #### Mongoid
195
+
196
+ ```
197
+ class Image
198
+ include MongoMapper::Document
199
+ include Balloon::Up
200
+
201
+ uploader :image, :db
202
+ uploader_size t: "45", s: "450", m: "770"
203
+ uploader_dir "uploads/product"
204
+ uploader_mimetype_white %w{image/jpeg image/png image/gif}
205
+ uploader_name_format name: Proc.new{|p| p.id.to_s }
206
+ end
207
+ ```
208
+
209
+
210
+
211
+ #### rails 实现图片上传
163
212
 
164
213
  直接试用model原生操作, 用uploader设置的参数作为上传参数
165
-
166
- @image = Images.new(image: file)
167
- @image.save
168
214
 
169
- ###### 又拍云支持
215
+ ```ruby
216
+ @picture = Picture.new(image: params[:image])
217
+ @picture.save
218
+
219
+ @picture.url #获取原图
220
+ @picture.url(size) #获得图片地址
221
+ ```
222
+
223
+
224
+
225
+ ##### 又拍云支持
170
226
 
171
227
  将store_storage 修改为 ‘upyun’, 在config/balloon.yml内添加下列内容
172
228
 
173
- ```
229
+ ```yaml
174
230
  upyun_domain: ""
175
231
  upyun_bucket: ""
176
232
  upyun_username: ""
@@ -181,5 +237,3 @@ end
181
237
 
182
238
 
183
239
 
184
-
185
-
File without changes
Binary file
Binary file
@@ -0,0 +1,19 @@
1
+ $LOAD_PATH.unshift(File.expand_path('../lib'))
2
+ require 'balloon'
3
+
4
+ Balloon.configure do |config|
5
+ config.store_storage = :file
6
+ config.root = "output"
7
+ end
8
+
9
+ class Upload < Balloon::Base
10
+ uploader :image
11
+ uploader_dir 'uploads'
12
+ uploader_mimetype_white %w[image/jpeg image/png image/gif image/webp]
13
+ uploader_name_format name: 'output', format: 'upcase'
14
+ uploader_type_format 'webp'
15
+ uploader_size thumb: '200x', small: '600x>', large: '800x>'
16
+ end
17
+
18
+ upload = Upload.new("input.jpg")
19
+ upload.upload_store
@@ -0,0 +1,24 @@
1
+ $LOAD_PATH.unshift(File.expand_path('../lib'))
2
+ require 'balloon'
3
+ require "mini_magick"
4
+
5
+ Balloon.configure do |config|
6
+ config.store_storage = :file
7
+ config.root = "output"
8
+ end
9
+
10
+ class Upload < Balloon::Base
11
+ uploader :image
12
+ uploader_dir 'uploads/images'
13
+ uploader_mimetype_white %w[image/jpeg image/png image/gif image/webp]
14
+ uploader_name_format name: proc { |img| img.file_name }
15
+ uploader_type_format 'webp'
16
+ uploader_size thumb: '100x100', small: '200x>'
17
+
18
+ def file_name
19
+ "output_gif"
20
+ end
21
+ end
22
+
23
+ upload = Upload.new("input.gif")
24
+ upload.upload_store
data/lib/balloon/base.rb CHANGED
@@ -9,6 +9,10 @@ module Balloon
9
9
  @file = upload_file.is_a?(Hash) ? upload_file[:#{name}] : upload_file
10
10
  end
11
11
 
12
+ def #{name}
13
+ @meta
14
+ end
15
+
12
16
  def uploader_name
13
17
  "#{name}".pluralize
14
18
  end
@@ -28,8 +32,8 @@ module Balloon
28
32
  uploader_file = upload_file.nil? ? @file : upload_file
29
33
  save_to_cache(uploader_file)
30
34
  store_info = storage_engine.store!
31
- @info[:filename] = store_info[:filename]
32
- @info[:basename] = store_info[:basename]
35
+ @meta[:filename] = store_info[:filename]
36
+ @meta[:basename] = store_info[:basename]
33
37
  end
34
38
 
35
39
  def from_store(size_name = nil)
@@ -1,7 +1,10 @@
1
1
  module Balloon
2
2
  module Configuration
3
3
 
4
- STORAGE_EGINE = { file: "Balloon::Storage::File", upyun: "Balloon::Storage::Upyun" }
4
+ STORAGE_EGINE = {
5
+ file: "Balloon::Storage::File",
6
+ upyun: "Balloon::Storage::Upyun"
7
+ }
5
8
 
6
9
  class << self
7
10
  def included(base)
@@ -32,7 +32,8 @@ module Balloon
32
32
  IMAGE_EXT_LIST = {
33
33
  "image/gif" => "gif",
34
34
  "image/jpeg" => "jpg",
35
- "image/png" => "png"
35
+ "image/png" => "png",
36
+ "image/webp" => "webp"
36
37
  }
37
38
 
38
39
  def initialize(file, mime_type = nil)
@@ -133,6 +134,9 @@ module Balloon
133
134
  end
134
135
  end
135
136
 
137
+ def self.get_extension(mime_type)
138
+ IMAGE_EXT_LIST[mime_type]
139
+ end
136
140
 
137
141
  # @todo What Change basename add extension
138
142
  def save_to(new_path, permissions = nil, directory_permission = nil)
@@ -4,71 +4,137 @@ module Balloon
4
4
  module Processing
5
5
  extend ActiveSupport::Concern
6
6
 
7
- def resize_with_string(file)
8
- width, height = "", ""
9
- oranginl_img = MiniMagick::Image.open(file.path)
10
- auto_orient!(oranginl_img, file.path)
11
- if self.respond_to?(:uploader_size) && !(store_storage.to_s == "upyun" && upyun_is_image)
12
- uploader_size.each do |s, o|
13
- img = MiniMagick::Image.open(file.path)
14
- raise ProcessError, "process error" unless img
15
- width = img[:width]
16
- height = img[:height]
17
- new_img = resize(img, o)
18
- new_img.write File.join(cache_path, "#{file.basename}_#{s}.#{file.extension}")
19
- end
7
+ def image_processing(image)
8
+ data = {}
9
+ ext = image.extension
10
+
11
+ if respond_to?(:uploader_type_format)
12
+ ext = uploader_type_format
13
+ end
14
+
15
+ processed_img = handle_original(image, ext)
16
+ data[:original] = get_image_data(processed_img)
17
+
18
+ total_size = handle_resize(image, ext, data)
19
+ data[:total_size] = processed_img.size.to_i + total_size.to_i
20
+
21
+ mime_type = processed_img.mime_type
22
+ extension = FileExtension.get_extension(mime_type)
23
+ filename = "#{image.basename}.#{extension}"
24
+
25
+ return {
26
+ basename: image.basename,
27
+ width: processed_img.width,
28
+ height: processed_img.height,
29
+ size: processed_img.size,
30
+ filename: filename,
31
+ mime_type: mime_type,
32
+ extension: extension,
33
+ data: data
34
+ }
35
+ end
36
+
37
+ def handle_original(file, ext)
38
+ original_image = MiniMagick::Image.open(file.path)
39
+ convert = MiniMagick::Tool::Convert.new
40
+ convert << file.path
41
+
42
+ auto_orient!(original_image, convert)
43
+ convert.format ext
44
+
45
+ cache_file = File.join(cache_path, "#{file.basename}.#{ext}")
46
+ convert << cache_file
47
+ convert.call
48
+
49
+ return MiniMagick::Image.open(cache_file)
50
+ end
51
+
52
+ def handle_resize(file, ext, data)
53
+ return unless self.respond_to?(:uploader_size)
54
+ return if store_storage.to_s == "upyun" && upyun_is_image
55
+ total_size = 0
56
+
57
+ uploader_size.each do |size, o|
58
+ img = MiniMagick::Image.open(file.path)
59
+ raise ProcessError, "process error" unless img
60
+
61
+ convert = MiniMagick::Tool::Convert.new
62
+ convert << file.path
63
+
64
+ auto_orient!(img, convert)
65
+ convert.format ext
66
+
67
+ resize(convert, img, o)
68
+ cache_file = File.join(cache_path, "#{file.basename}_#{size}.#{ext}")
69
+ convert << cache_file
70
+ convert.call
71
+
72
+ processed_img = MiniMagick::Image.open(cache_file)
73
+ data[size] = get_image_data(processed_img)
74
+ total_size += processed_img.size
20
75
  end
21
- return {width: oranginl_img[:width], height: oranginl_img[:height]}
76
+
77
+ return total_size
22
78
  end
23
79
 
24
- def resize(image, size)
25
- width, height, symbol = size[:width], size[:height], size[:symbol]
80
+ def resize(convert, image, size)
81
+ width, height, symbol = size[:width], size[:height], size[:symbol]
82
+
26
83
  if !symbol.empty? || width.match(/\%/) || height.match(/\%/)
27
84
  if width == height
28
- image = shave(image)
29
- image.resize "#{width}"
85
+ shave(convert, image)
86
+ convert.resize "#{width}"
30
87
  else
31
- image.resize "#{width}x#{height}#{symbol}"
88
+ convert.resize "#{width}x#{height}#{symbol}"
32
89
  end
90
+ return
91
+ end
92
+
93
+ if width == height
94
+ shave(convert, image)
95
+ value = (width.to_f / image[:width].to_f) * 100
96
+ convert.resize "#{value}%"
97
+ return
98
+ end
99
+
100
+ if width.empty?
101
+ value = (height.to_f / image[:height].to_f) * 100
102
+ convert.resize "#{value}%"
103
+ elsif height.empty?
104
+ value = (width.to_f / image[:width].to_f) * 100
105
+ convert.resize "#{value}%"
33
106
  else
34
- if width == height
35
- image = shave(image)
36
- value = (width.to_f / image[:width].to_f) * 100
37
- image.resize "#{value}%"
38
- else
39
- if width.empty?
40
- value = (height.to_f / image[:height].to_f) * 100
41
- image.resize "#{value}%"
42
- elsif height.empty?
43
- value = (width.to_f / image[:width].to_f) * 100
44
- image.resize "#{value}%"
45
- else
46
- image.resize "#{width}x#{height}"
47
- end
48
- end
107
+ convert.resize "#{width}x#{height}"
49
108
  end
50
- return image
51
109
  end
52
110
 
53
- def shave(image)
111
+ def shave(convert, image)
54
112
  w, h = image[:width], image[:height]
113
+
55
114
  if w > h
56
115
  shave_off = ((w - h) / 2).round
57
- image.shave "#{shave_off}x0"
58
- else
59
- shave_off = ((h - w) / 2).round
60
- image.shave "0x#{shave_off}"
61
- end
62
- return image
116
+ convert.shave "#{shave_off}x0"
117
+ return
118
+ end
119
+
120
+ shave_off = ((h - w) / 2).round
121
+ convert.shave "0x#{shave_off}"
63
122
  end
64
123
 
65
- def auto_orient!(img, file)
124
+ def auto_orient!(img, covert)
66
125
  if img.exif["Orientation"].to_i > 1
67
- img.auto_orient
68
- img.write file
126
+ convert.auto_orient
69
127
  end
70
128
  end
71
129
 
130
+ def get_image_data(img)
131
+ return {
132
+ width: img.width,
133
+ height: img.height,
134
+ size: img.size
135
+ }
136
+ end
137
+
72
138
  # parseing the size string
73
139
  #
74
140
  # @return [Hash] the options for string
@@ -3,6 +3,7 @@ module Balloon
3
3
  class File < Balloon::Storage::Store
4
4
  def store!
5
5
  _store_path = store_path
6
+ cache_meta = @uploader.cache_meta
6
7
 
7
8
  if !::File.exists? _store_path
8
9
  FileUtils.mkdir_p _store_path
@@ -10,17 +11,23 @@ module Balloon
10
11
  end
11
12
 
12
13
  original_file = set_upload_name
14
+
13
15
  store_original_file = ::File.join _store_path, original_file
14
- cache_original_file = ::File.join @uploader.cache_path, @uploader.info[:filename]
16
+ cache_original_file = ::File.join @uploader.cache_path, cache_meta[:filename]
17
+
15
18
  FileUtils.mv cache_original_file, store_original_file
16
19
 
17
20
  if @uploader.respond_to?(:uploader_size)
18
21
  @uploader.uploader_size.each do |s, o|
19
22
  store_file = ::File.join _store_path, set_upload_name(s)
20
- cache_file = ::File.join @uploader.cache_path, @uploader.info[:basename]+ "_#{s}"+"."+ @uploader.info[:extension]
23
+ cache_file = ::File.join @uploader.cache_path, cache_meta[:basename]+ "_#{s}"+"."+ cache_meta[:extension]
21
24
  FileUtils.mv cache_file, store_file
22
25
  end
23
26
  end
27
+
28
+ # Remove cache path
29
+ FileUtils.remove_dir(@uploader.cache_path)
30
+
24
31
  return { filename: original_file, basename: store_name}
25
32
  end
26
33
 
@@ -55,7 +62,8 @@ module Balloon
55
62
  end
56
63
 
57
64
  def store_path
58
- ::File.expand_path ::File.join(@uploader.root, @uploader.store_dir, upload_dir)
65
+ root_path = @uploader.root || "."
66
+ ::File.expand_path ::File.join(root_path, @uploader.store_dir, upload_dir)
59
67
  end
60
68
  end
61
69
  end
@@ -10,8 +10,9 @@ module Balloon
10
10
  def retrieve!(size_name = nil); end
11
11
 
12
12
  def upload_file
13
- file_info = @uploader.info
13
+ file_info = @uploader.meta
14
14
  return {} if file_info.nil?
15
+
15
16
  basename = file_info[:basename] || ""
16
17
  extension = file_info[:extension] || ""
17
18
  { basename: basename, extension: extension }
@@ -22,24 +23,30 @@ module Balloon
22
23
  end
23
24
 
24
25
  def store_name
25
- return upload_file[:basename] if !@uploader.respond_to?(:uploader_name_format)
26
+ if !@uploader.respond_to?(:uploader_name_format)
27
+ return @uploader.cache_meta[:basename]
28
+ end
29
+
26
30
  name_format = @uploader.uploader_name_format
27
31
  name = name_format[:name]
28
- if name_format[:format].to_s == "downcase"
29
- name = name.downcase
30
- elsif name_format[:format].to_s == "upcase"
31
- name = name.upcase
32
- else
33
- name
32
+
33
+ if name_format[:format].to_s == "downcase"
34
+ return name.downcase
34
35
  end
36
+
37
+ if name_format[:format].to_s == "upcase"
38
+ return name.upcase
39
+ end
40
+
41
+ name
35
42
  end
36
43
 
37
44
  def set_upload_name(size_name = nil )
38
- if size_name
39
- store_name + "_#{size_name.to_s}" + "." + upload_file[:extension]
40
- else
41
- store_name + "." + upload_file[:extension]
45
+ cache_meta = @uploader.cache_meta
46
+ if size_name
47
+ return store_name + "_#{size_name.to_s}" + "." + cache_meta[:extension]
42
48
  end
49
+ store_name + "." + cache_meta[:extension]
43
50
  end
44
51
 
45
52
  def connection
@@ -49,7 +56,7 @@ module Balloon
49
56
  conn = Http::Client.new(options[:url]) do |builder|
50
57
  builder.headers = options[:headers]
51
58
  builder.basic_auth(basic[:user], basic[:password]) if !basic.nil?
52
- builder.token_auth(self, token) if !token.nil?
59
+ builder.token_auth(self, token) if !token.nil?
53
60
  end
54
61
  return conn
55
62
  end
@@ -16,9 +16,11 @@ module Balloon
16
16
 
17
17
  def store!
18
18
  _store_path = store_path
19
+ cache_meta = @uploader.cache_meta
19
20
  original_file = set_upload_name
21
+
20
22
  store_original_file = ::File.join _store_path, original_file
21
- cache_original_file = ::File.join @uploader.cache_path, @uploader.info[:filename]
23
+ cache_original_file = ::File.join @uploader.cache_path, cache_meta[:filename]
22
24
  file = ::File.new cache_original_file
23
25
  response = connection.put(store_original_file, file.read, file.size)
24
26
  raise "Connection errors" if response.nil?
@@ -26,12 +28,13 @@ module Balloon
26
28
  if !@uploader.upyun_is_image && @uploader.respond_to?(:uploader_size)
27
29
  @uploader.uploader_size.each do |s, o|
28
30
  store_file = ::File.join _store_path, set_upload_name(s)
29
- cache_file = ::File.join @uploader.cache_path, @uploader.info[:basename]+ "_#{s}"+"."+ @uploader.info[:extension]
31
+ cache_file = ::File.join @uploader.cache_path, cache_meta[:basename]+ "_#{s}"+"."+ cache_meta[:extension]
30
32
  file = ::File.new cache_file
31
33
  connection.put(store_file, file.read, file.size)
32
34
  end
33
35
  end
34
36
 
37
+ FileUtils.remove_dir(@uploader.cache_path)
35
38
  return { filename: original_file, basename: store_name }
36
39
  end
37
40
 
data/lib/balloon/up.rb CHANGED
@@ -22,15 +22,15 @@ module Balloon
22
22
  end
23
23
 
24
24
  def #{name}
25
- @info
25
+ @meta
26
26
  end
27
27
 
28
28
  def uploader_save
29
- return if info.nil?
29
+ return if cache_meta.nil?
30
30
  set_storage_engine
31
31
  store_info = storage_engine.store!
32
- @info[:filename] = store_info[:filename]
33
- @info[:basename] = store_info[:basename]
32
+ @meta[:filename] = store_info[:filename]
33
+ @meta[:basename] = store_info[:basename]
34
34
  end
35
35
 
36
36
  def uploader_name
@@ -51,6 +51,7 @@ module Balloon
51
51
  key :content_type, String
52
52
  key :file_size, Integer
53
53
  key :storage, String
54
+ key :metadata
54
55
  key :created_at
55
56
  elsif defined?(Mongoid)
56
57
  field :file_name, type: String
@@ -59,6 +60,7 @@ module Balloon
59
60
  field :content_type, type: String
60
61
  field :file_size, type: String
61
62
  field :storage, type: String
63
+ field :metadata
62
64
  field :created_at
63
65
  end
64
66
 
@@ -67,20 +69,23 @@ module Balloon
67
69
 
68
70
  class_eval <<-RUBY
69
71
  def save_db
70
- return if info.nil?
71
- self.file_name = info[:filename]
72
- self.content_type = info[:mime_type]
73
- self.file_size = info[:size]
72
+ return if meta.nil?
73
+ self.file_name = meta[:filename]
74
+ self.content_type = meta[:mime_type]
75
+ self.file_size = meta[:size]
74
76
  self.storage = store_storage.to_s
75
- self.width = info[:width]
76
- self.height = info[:height]
77
+ self.width = meta[:width]
78
+ self.height = meta[:height]
79
+ if self.respond_to?(:metadata)
80
+ self.metadata = meta[:data]
81
+ end
77
82
  end
78
83
 
79
84
  def url(size_name = nil)
80
85
  return "" if !respond_to?(:file_name) || file_name.nil?
81
86
  extension = self.file_name.to_s.match(%r"(?!\\.{1})\\w{2,}$")
82
87
  basename = self.file_name.to_s.gsub(%r"\\.{1}\\w{2,}$",'')
83
- @info = { basename: basename, extension: extension.to_s }
88
+ @meta = { basename: basename, extension: extension.to_s }
84
89
  set_storage_engine
85
90
  storage_engine.retrieve!(size_name)
86
91
  end
@@ -89,7 +94,7 @@ module Balloon
89
94
  return if !respond_to?(:file_name) || file_name.nil?
90
95
  extension = self.file_name.to_s.match(%r"(?!\\.{1})\\w{2,}$")
91
96
  basename = self.file_name.to_s.gsub(%r"\\.{1}\\w{2,}$",'')
92
- @info = { basename: basename, extension: extension.to_s }
97
+ @meta = { basename: basename, extension: extension.to_s }
93
98
  set_storage_engine
94
99
  storage_engine.delete!
95
100
  end
@@ -9,7 +9,7 @@ module Balloon
9
9
  include Balloon::Download
10
10
  attr_accessor :file
11
11
  attr_reader :storage_engine
12
- attr_reader :info
12
+ attr_reader :cache_meta, :meta
13
13
  attr_accessor :download_error, :process_error
14
14
  end
15
15
 
@@ -24,27 +24,27 @@ module Balloon
24
24
  file_mime_type = uploader_file_ext.mime_type
25
25
 
26
26
  if self.respond_to?(:uploader_mimetype_white)
27
- if !uploader_mimetype_white.include?(file_mime_type)
27
+ if !uploader_mimetype_white.include?(file_mime_type)
28
28
  raise Balloon::DownloadError, I18n.translate(:"errors.messages.down_mime_error")
29
29
  end
30
- elsif self.respond_to?(:uploader_mimetype_black)
31
- if !uploader_mimetype_black.include?(file_mime_type)
30
+ end
31
+
32
+ if self.respond_to?(:uploader_mimetype_black)
33
+ if !uploader_mimetype_black.include?(file_mime_type)
32
34
  raise Balloon::DownloadError, I18n.translate(:"errors.messages.down_mime_error")
33
35
  end
34
36
  end
35
37
 
36
38
  generate_cache_directory
37
39
  up_file = uploader_file_ext.save_to cache_path, permissions
38
- uploader_file = up_file
39
- img = resize_with_string up_file
40
- @info = {
41
- width: img[:width],
42
- height: img[:height],
43
- size: up_file.size,
44
- mime_type: up_file.mime_type,
45
- filename: up_file.filename,
46
- basename: up_file.basename,
47
- extension: up_file.extension
40
+ @cache_meta = image_processing up_file
41
+ @meta = {
42
+ width: @cache_meta[:width],
43
+ height: @cache_meta[:height],
44
+ size: @cache_meta[:size],
45
+ mime_type: @cache_meta[:mime_type],
46
+ extension: @cache_meta[:extension],
47
+ data: @cache_meta[:data]
48
48
  }
49
49
  end
50
50
 
@@ -71,16 +71,21 @@ module Balloon
71
71
 
72
72
  def uploader_name_format(info)
73
73
  define_method "uploader_name_format" do
74
- name = info[:name].nil? ? info[:name] : info[:name].call(self)
74
+ name = info[:name].is_a?(Proc) ? info[:name].call(self) : info[:name].to_s
75
75
  { name: name, format: info[:format] }
76
76
  end
77
77
  end
78
78
 
79
+ def uploader_type_format(ext)
80
+ define_method "uploader_type_format" do; ext; end
81
+ end
82
+
79
83
  def uploader_mimetype_white(list)
80
84
  raise "just choise one method" if respond_to?(:uploader_mime_type_black)
81
85
  define_method "uploader_mimetype_white" do; list; end
82
86
  end
83
87
 
88
+
84
89
  def uploader_mimetype_black(list)
85
90
  raise "just choise one method" if respond_to?(:uploader_mime_type_black)
86
91
  define_method "uploader_mimetype_black" do; list; end
@@ -1,3 +1,3 @@
1
1
  module Balloon
2
- VERSION = "1.0.4"
2
+ VERSION = "1.1.2"
3
3
  end
@@ -2,7 +2,7 @@ module Balloon
2
2
  module Generators
3
3
  class ConfigGenerator < Rails::Generators::Base
4
4
  desc "create the Balloon configuration at config/balloon.yml"
5
-
5
+
6
6
  def self.source_root
7
7
  @source_root ||= File.expand_path("../templates", __FILE__)
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: balloon
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - yeeli
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-02-21 00:00:00.000000000 Z
11
+ date: 2022-05-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -179,6 +179,11 @@ files:
179
179
  - README_EN.md
180
180
  - Rakefile
181
181
  - balloon.gemspec
182
+ - examples/balloon.yml
183
+ - examples/input.gif
184
+ - examples/input.jpg
185
+ - examples/upload.rb
186
+ - examples/upload_gif.rb
182
187
  - lib/balloon.rb
183
188
  - lib/balloon/base.rb
184
189
  - lib/balloon/cache.rb
@@ -221,7 +226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
226
  - !ruby/object:Gem::Version
222
227
  version: '0'
223
228
  requirements: []
224
- rubygems_version: 3.3.3
229
+ rubygems_version: 3.3.7
225
230
  signing_key:
226
231
  specification_version: 4
227
232
  summary: Ruby image upload libary