balloon 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/README.md +185 -0
- data/README_EN.md +4 -0
- data/Rakefile +1 -0
- data/balloon.gemspec +35 -0
- data/lib/balloon.rb +42 -0
- data/lib/balloon/base.rb +43 -0
- data/lib/balloon/cache.rb +44 -0
- data/lib/balloon/configuration.rb +85 -0
- data/lib/balloon/download.rb +50 -0
- data/lib/balloon/error.rb +5 -0
- data/lib/balloon/file_extension.rb +187 -0
- data/lib/balloon/http/client.rb +91 -0
- data/lib/balloon/http/response.rb +71 -0
- data/lib/balloon/load.rb +33 -0
- data/lib/balloon/locale/en.yml +7 -0
- data/lib/balloon/processing.rb +98 -0
- data/lib/balloon/storage/file.rb +62 -0
- data/lib/balloon/storage/store.rb +84 -0
- data/lib/balloon/storage/upyun.rb +91 -0
- data/lib/balloon/up.rb +100 -0
- data/lib/balloon/uploader.rb +90 -0
- data/lib/balloon/validate.rb +41 -0
- data/lib/balloon/version.rb +3 -0
- data/lib/rails/generators/balloon/config/config_generator.rb +15 -0
- data/lib/rails/generators/balloon/config/templates/balloon.yml +11 -0
- data/spec/fixtures/UPCASE.JPG +0 -0
- data/spec/fixtures/egg +0 -0
- data/spec/fixtures/invalid.jpg +1 -0
- data/spec/fixtures/kid.gif +0 -0
- data/spec/fixtures/kids.gif +0 -0
- data/spec/fixtures/word.txt +1 -0
- metadata +237 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b9a840a4692178db52423213fcf6ead8d068f889
|
4
|
+
data.tar.gz: 514e31edc3e12d36b7622282e62bf726e80553d2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1747c58e04a86ab1a498686714535e271e6ad964f1451bb1e8c0f4050a0a14f44a6baf696163b00f11588ec347d7beb19be49e305001f87f525fcbe71a4c92e1
|
7
|
+
data.tar.gz: bd76ecc3b4244ca575d20f853b02e67575290464198543efcee59294484f770485174cea200e70368085bbdb3fb0e3286993e40cbe26607a0b6e033223447150
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,185 @@
|
|
1
|
+
# Balloon
|
2
|
+
|
3
|
+
|
4
|
+
Balloon是基于Ruby的图片上传插件, 并且可以完美配合Rails使用。
|
5
|
+
|
6
|
+
|
7
|
+
## 安装
|
8
|
+
|
9
|
+
|
10
|
+
将下列文字添加到你程序中的Gemfile里
|
11
|
+
|
12
|
+
```
|
13
|
+
gem 'balloon'
|
14
|
+
|
15
|
+
或者
|
16
|
+
|
17
|
+
gem 'ballon', github: 'yeeli/balloon'
|
18
|
+
```
|
19
|
+
|
20
|
+
并执行:
|
21
|
+
|
22
|
+
$ bundle
|
23
|
+
|
24
|
+
或者直接通过命令安装:
|
25
|
+
|
26
|
+
$ gem install balloon
|
27
|
+
|
28
|
+
## 单独使用
|
29
|
+
|
30
|
+
```
|
31
|
+
require 'balloon'
|
32
|
+
|
33
|
+
Balloon.configure do |config|
|
34
|
+
config.store_storage = :file
|
35
|
+
end
|
36
|
+
|
37
|
+
class Upload < Balloon::Base
|
38
|
+
uploader :avatar
|
39
|
+
uploader_size t: "100x100"
|
40
|
+
uploader_name_format
|
41
|
+
end
|
42
|
+
|
43
|
+
file = File.new("file.jpg")
|
44
|
+
|
45
|
+
upload = Upload.new("file")
|
46
|
+
|
47
|
+
upload.upload_store #上传图片
|
48
|
+
|
49
|
+
upload.from_store(:t) #获得图片Path
|
50
|
+
|
51
|
+
```
|
52
|
+
|
53
|
+
## 在Rails中使用
|
54
|
+
|
55
|
+
|
56
|
+
在Rails应用程序中运行下述命令来完成Balloon插件的初始化
|
57
|
+
|
58
|
+
$ rails g balloon:config
|
59
|
+
|
60
|
+
在运行命令后, 会在config目录中生成一个balloon.yml配置文件
|
61
|
+
|
62
|
+
###### 默认生成balloon.yml文件
|
63
|
+
|
64
|
+
````
|
65
|
+
defaults: &defaults
|
66
|
+
store_storage: 'file'
|
67
|
+
|
68
|
+
development:
|
69
|
+
<<: *defaults
|
70
|
+
|
71
|
+
test:
|
72
|
+
<<: *defaults
|
73
|
+
|
74
|
+
production:
|
75
|
+
<<: *defaults
|
76
|
+
````
|
77
|
+
|
78
|
+
balloon.yml 配置介绍
|
79
|
+
|
80
|
+
```
|
81
|
+
store_storage: 设置 文件储存位置, file: 文件储存, upyun: 又拍云存储
|
82
|
+
|
83
|
+
asset_host : 设置 asset
|
84
|
+
|
85
|
+
root: 设置主目录, 默认为当前应用程序的主目录
|
86
|
+
|
87
|
+
permissions: 设置生成文件目录权限, 默认为0777
|
88
|
+
|
89
|
+
store_dir: 设置存储目录, 默认为主目录下的"public"目录
|
90
|
+
|
91
|
+
cache_dir: "tmp" # 设置临时文件储存目录, 默认为主目录下的“tmp”目录
|
92
|
+
```
|
93
|
+
|
94
|
+
###### 在为model文件添加下列格式
|
95
|
+
|
96
|
+
Mongomapper, Mongoid
|
97
|
+
|
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
|
+
|
111
|
+
model 配置介绍
|
112
|
+
|
113
|
+
```
|
114
|
+
uploder 设置uploader名称, :db 后台生成数据key
|
115
|
+
|
116
|
+
uploader_size #设置文件裁切大小及文件名, 裁切格式参考
|
117
|
+
|
118
|
+
uploader_dir #设置上传目录, 未指定,默认为uploader设置的name为目录名
|
119
|
+
|
120
|
+
uploader_mimetype_white #设置上传白名单
|
121
|
+
|
122
|
+
uploader_name_format #对上传文件进行重命名,
|
123
|
+
```
|
124
|
+
|
125
|
+
|
126
|
+
ActiveRecord
|
127
|
+
|
128
|
+
先生成 model文件
|
129
|
+
|
130
|
+
$ rails g model image
|
131
|
+
|
132
|
+
并修改migration文件, 为下列格式
|
133
|
+
|
134
|
+
```
|
135
|
+
|
136
|
+
class CreateImages < ActiveRecord::Migration
|
137
|
+
def change
|
138
|
+
create_table :pictures do |t|
|
139
|
+
t.string :file_name
|
140
|
+
t.string :content_type
|
141
|
+
t.integer :file_size
|
142
|
+
t.string :storage
|
143
|
+
t.datetime :created_at
|
144
|
+
t.timestamps
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
```
|
150
|
+
|
151
|
+
在 model 文件
|
152
|
+
|
153
|
+
```
|
154
|
+
class Image < ActiveRecord::Base
|
155
|
+
include Balloon::Up
|
156
|
+
|
157
|
+
uploader :image
|
158
|
+
end
|
159
|
+
|
160
|
+
```
|
161
|
+
|
162
|
+
###### rails实现图片上传
|
163
|
+
|
164
|
+
直接试用model原生操作, 用uploader设置的参数作为上传参数
|
165
|
+
|
166
|
+
@image = Images.new(image: file)
|
167
|
+
@image.save
|
168
|
+
|
169
|
+
###### 又拍云支持
|
170
|
+
|
171
|
+
将store_storage 修改为 ‘upyun’, 在config/balloon.yml内添加下列内容
|
172
|
+
|
173
|
+
```
|
174
|
+
upyun_domain: ""
|
175
|
+
upyun_bucket: ""
|
176
|
+
upyun_username: ""
|
177
|
+
upyun_password: ""
|
178
|
+
upyun_timeout: 600
|
179
|
+
upyun_is_image: true # true: 又拍云为图片空间Balloon将只上传原图, false: 又拍云为普通空间, 将会上传所有图片
|
180
|
+
```
|
181
|
+
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
|
data/README_EN.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/balloon.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "balloon/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "balloon"
|
7
|
+
s.version = Balloon::VERSION
|
8
|
+
s.authors = ["yeeli"]
|
9
|
+
s.email = ["yeeli@outlook.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = "Ruby image upload libary"
|
12
|
+
s.description = %q{Ruby image upload libary}
|
13
|
+
|
14
|
+
s.rubyforge_project = "balloon"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
|
22
|
+
s.add_dependency "activesupport"
|
23
|
+
s.add_dependency "mini_magick"
|
24
|
+
s.add_dependency "faraday"
|
25
|
+
s.add_dependency "mime-types"
|
26
|
+
|
27
|
+
#development
|
28
|
+
s.add_development_dependency "rails"
|
29
|
+
s.add_development_dependency "rspec"
|
30
|
+
s.add_development_dependency "mysql2"
|
31
|
+
s.add_development_dependency "mongo_mapper"
|
32
|
+
s.add_development_dependency "mongoid"
|
33
|
+
s.add_development_dependency "bson_ext"
|
34
|
+
s.add_development_dependency "activerecord"
|
35
|
+
end
|
data/lib/balloon.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#coding:utf-8
|
2
|
+
require "balloon/version"
|
3
|
+
require 'active_support'
|
4
|
+
require 'active_support/core_ext'
|
5
|
+
|
6
|
+
module Balloon
|
7
|
+
class << self
|
8
|
+
attr_accessor :root
|
9
|
+
def configure(&block)
|
10
|
+
Balloon::Base.configure &block
|
11
|
+
end
|
12
|
+
|
13
|
+
def configure_load(config, env)
|
14
|
+
Balloon::Base.setup config, env
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
autoload :Uploader, 'balloon/uploader'
|
19
|
+
autoload :Base, 'balloon/base'
|
20
|
+
autoload :Configuration, 'balloon/configuration'
|
21
|
+
autoload :Processing, 'balloon/processing'
|
22
|
+
autoload :Cache, 'balloon/cache'
|
23
|
+
autoload :FileExtension, 'balloon/file_extension'
|
24
|
+
autoload :Download, 'balloon/download'
|
25
|
+
autoload :Validate, 'balloon/validate'
|
26
|
+
|
27
|
+
module Http
|
28
|
+
autoload :Client, 'balloon/http/client'
|
29
|
+
autoload :Response, 'balloon/http/response'
|
30
|
+
end
|
31
|
+
|
32
|
+
module Storage
|
33
|
+
autoload :Store, 'balloon/storage/store'
|
34
|
+
autoload :File, 'balloon/storage/file'
|
35
|
+
autoload :Upyun, 'balloon/storage/upyun'
|
36
|
+
end
|
37
|
+
|
38
|
+
autoload :Up, 'balloon/up'
|
39
|
+
end
|
40
|
+
|
41
|
+
require 'balloon/load'
|
42
|
+
require 'balloon/error'
|
data/lib/balloon/base.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
module Balloon
|
2
|
+
class Base
|
3
|
+
include Balloon::Uploader
|
4
|
+
|
5
|
+
def self.uploader(name)
|
6
|
+
class_eval <<-RUBY
|
7
|
+
def initialize(upload_file = nil)
|
8
|
+
set_storage_engine
|
9
|
+
@file = upload_file.is_a?(Hash) ? upload_file[:#{name}] : upload_file
|
10
|
+
end
|
11
|
+
|
12
|
+
def uploader_name
|
13
|
+
"#{name}".pluralize
|
14
|
+
end
|
15
|
+
|
16
|
+
def set_storage_engine
|
17
|
+
return if respond_to?(:@storage_engine)
|
18
|
+
@storage_engine = eval(STORAGE_EGINE[store_storage.to_sym]).new(self)
|
19
|
+
end
|
20
|
+
RUBY
|
21
|
+
end
|
22
|
+
|
23
|
+
# upload file save storage
|
24
|
+
#
|
25
|
+
# @param [File] upload_file the upload file
|
26
|
+
#
|
27
|
+
def upload_store(upload_file = nil)
|
28
|
+
uploader_file = upload_file.nil? ? @file : upload_file
|
29
|
+
save_to_cache(uploader_file)
|
30
|
+
store_info = storage_engine.store!
|
31
|
+
@info[:filename] = store_info[:filename]
|
32
|
+
@info[:basename] = store_info[:basename]
|
33
|
+
end
|
34
|
+
|
35
|
+
def from_store(size_name = nil)
|
36
|
+
storage_engine.retrieve!(size_name)
|
37
|
+
end
|
38
|
+
|
39
|
+
def upload_delete
|
40
|
+
storage_engine.delete!
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Balloon
|
2
|
+
module Cache
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
attr_reader :cache_cid
|
6
|
+
|
7
|
+
# generate cache directory in system
|
8
|
+
#
|
9
|
+
# @return
|
10
|
+
def generate_cache_directory
|
11
|
+
@cache_cid = generate_cid
|
12
|
+
FileUtils.mkdir_p(cache_path)
|
13
|
+
FileUtils.chmod dir_permissions.to_i, cache_path
|
14
|
+
end
|
15
|
+
|
16
|
+
def cache_path
|
17
|
+
File.expand_path cache_directory, root
|
18
|
+
end
|
19
|
+
|
20
|
+
def cache_directory
|
21
|
+
File.join cache_dir, "images", cache_cid
|
22
|
+
end
|
23
|
+
|
24
|
+
def generate_down_cache_directory
|
25
|
+
FileUtils.mkdir_p(down_cache_path)
|
26
|
+
FileUtils.chmod dir_permissions.to_i, down_cache_path
|
27
|
+
end
|
28
|
+
|
29
|
+
def down_cache_path
|
30
|
+
File.expand_path down_cache_directory, root
|
31
|
+
end
|
32
|
+
|
33
|
+
def down_cache_directory
|
34
|
+
File.join cache_dir, "net"
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def generate_cid
|
40
|
+
now = Time.now
|
41
|
+
"#{now.to_i}.#{now.usec}.#{Process.pid}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Balloon
|
2
|
+
module Configuration
|
3
|
+
|
4
|
+
STORAGE_EGINE = { file: "Balloon::Storage::File", upyun: "Balloon::Storage::Upyun" }
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def included(base)
|
8
|
+
base.extend ClassMethods
|
9
|
+
set_config :root
|
10
|
+
set_config :permissions
|
11
|
+
set_config :dir_permissions
|
12
|
+
set_config :store_storage
|
13
|
+
set_config :cache_dir
|
14
|
+
set_config :store_dir
|
15
|
+
set_config :asset_host
|
16
|
+
|
17
|
+
set_config :upyun_api_host
|
18
|
+
set_config :upyun_username
|
19
|
+
set_config :upyun_password
|
20
|
+
set_config :upyun_bucket
|
21
|
+
set_config :upyun_timeout
|
22
|
+
set_config :upyun_domain
|
23
|
+
set_config :upyun_thumb_symbol
|
24
|
+
set_config :upyun_is_image
|
25
|
+
set_config :upyun_headers
|
26
|
+
|
27
|
+
reset_config if base == Balloon::Base
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_config(name)
|
31
|
+
ClassMethods.class_eval <<-RUBY
|
32
|
+
attr_writer :#{name}
|
33
|
+
alias :uploader_#{name} :#{name}=
|
34
|
+
def #{name}; @#{name}; end
|
35
|
+
RUBY
|
36
|
+
|
37
|
+
class_eval <<-RUBY
|
38
|
+
def #{name}
|
39
|
+
value = self.class.#{name}
|
40
|
+
value.nil? ? Balloon::Base.#{name} : value
|
41
|
+
end
|
42
|
+
RUBY
|
43
|
+
end
|
44
|
+
|
45
|
+
def reset_config
|
46
|
+
Balloon.configure do |config|
|
47
|
+
config.root = Balloon.root
|
48
|
+
config.permissions = 0644
|
49
|
+
config.dir_permissions = 0755
|
50
|
+
config.store_storage = :file
|
51
|
+
config.store_dir = "public"
|
52
|
+
config.cache_dir = "tmp"
|
53
|
+
|
54
|
+
config.upyun_headers = {}
|
55
|
+
config.upyun_thumb_symbol = '!'
|
56
|
+
config.upyun_is_image = false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
module ClassMethods
|
62
|
+
def configure; yield self; end
|
63
|
+
|
64
|
+
def setup(configure, env)
|
65
|
+
conf = configure[env]
|
66
|
+
conf = configure['defaults'] if conf.nil?
|
67
|
+
Balloon.configure do |config|
|
68
|
+
conf.each do | n, v |
|
69
|
+
if !v.blank? || v ==true || v == false
|
70
|
+
if v ==true || v == false
|
71
|
+
class_eval <<-RUBY
|
72
|
+
config.#{n} = #{v}
|
73
|
+
RUBY
|
74
|
+
else
|
75
|
+
class_eval <<-RUBY
|
76
|
+
config.#{n} = '#{v}'
|
77
|
+
RUBY
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|