qiniu_jxb_fix 6.4.2
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.
- data/.gitignore +18 -0
- data/.rspec +1 -0
- data/.travis.yml +12 -0
- data/CHANGELOG.md +146 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +44 -0
- data/LICENSE +22 -0
- data/README.md +47 -0
- data/Rakefile +21 -0
- data/docs/README.md +790 -0
- data/lib/qiniu/abstract.rb +22 -0
- data/lib/qiniu/adt.rb +46 -0
- data/lib/qiniu/auth.rb +255 -0
- data/lib/qiniu/config.rb +60 -0
- data/lib/qiniu/exceptions.rb +120 -0
- data/lib/qiniu/fop.rb +4 -0
- data/lib/qiniu/http.rb +137 -0
- data/lib/qiniu/image.rb +38 -0
- data/lib/qiniu/log.rb +15 -0
- data/lib/qiniu/management.rb +166 -0
- data/lib/qiniu/misc.rb +35 -0
- data/lib/qiniu/pfop.rb +124 -0
- data/lib/qiniu/resumable_upload.rb +319 -0
- data/lib/qiniu/storage.rb +5 -0
- data/lib/qiniu/tokens/access_token.rb +23 -0
- data/lib/qiniu/tokens/download_token.rb +36 -0
- data/lib/qiniu/tokens/qbox_token.rb +38 -0
- data/lib/qiniu/tokens/upload_token.rb +57 -0
- data/lib/qiniu/upload.rb +134 -0
- data/lib/qiniu/utils.rb +109 -0
- data/lib/qiniu/version.rb +17 -0
- data/lib/qiniu-rs.rb +2 -0
- data/lib/qiniu.rb +209 -0
- data/qiniu.gemspec +29 -0
- data/rails3/Gemfile +4 -0
- data/rails3/qiniu.gemspec +29 -0
- data/spec/qiniu/abstract_spec.rb +30 -0
- data/spec/qiniu/auth_spec.rb +74 -0
- data/spec/qiniu/image_logo_for_test.png +0 -0
- data/spec/qiniu/image_spec.rb +80 -0
- data/spec/qiniu/management_spec.rb +163 -0
- data/spec/qiniu/misc_spec.rb +53 -0
- data/spec/qiniu/pfop_spec.rb +80 -0
- data/spec/qiniu/qiniu_spec.rb +321 -0
- data/spec/qiniu/tokens/qbox_token_spec.rb +29 -0
- data/spec/qiniu/upload_spec.rb +301 -0
- data/spec/qiniu/utils_spec.rb +49 -0
- data/spec/qiniu/version_spec.rb +10 -0
- data/spec/spec_helper.rb +19 -0
- metadata +222 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'qiniu/tokens/access_token'
|
5
|
+
require 'qiniu/utils'
|
6
|
+
require 'qiniu/helper'
|
7
|
+
|
8
|
+
### DownloadToken 类已经过时,请改用 Qiniu::Auth.authorize_download_url 方法 ###
|
9
|
+
### 或 Qiniu::Auth.authorize_download_url_2 方法 ###
|
10
|
+
|
11
|
+
module Qiniu
|
12
|
+
class DownloadToken < AccessToken
|
13
|
+
include Helper
|
14
|
+
|
15
|
+
include Utils
|
16
|
+
|
17
|
+
attr_accessor :pattern, :expires_in
|
18
|
+
|
19
|
+
def initialize(opts = {})
|
20
|
+
@pattern = opts[:pattern]
|
21
|
+
@expires_in = opts[:expires_in] || 3600
|
22
|
+
end
|
23
|
+
|
24
|
+
def generate_signature
|
25
|
+
params = {"S" => @pattern, "E" => get_expire_time.to_i + @expires_in}
|
26
|
+
Utils.urlsafe_base64_encode(params.to_json)
|
27
|
+
end
|
28
|
+
|
29
|
+
def generate_token
|
30
|
+
signature = generate_signature
|
31
|
+
encoded_digest = generate_encoded_digest(signature)
|
32
|
+
%Q(#{@access_key}:#{encoded_digest}:#{signature})
|
33
|
+
end
|
34
|
+
|
35
|
+
end # moidule DownloadToken
|
36
|
+
end # module Qiniu
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'cgi'
|
4
|
+
require 'json'
|
5
|
+
require 'qiniu/tokens/access_token'
|
6
|
+
|
7
|
+
module Qiniu
|
8
|
+
class QboxToken < AccessToken
|
9
|
+
|
10
|
+
include Utils
|
11
|
+
|
12
|
+
attr_accessor :url, :params
|
13
|
+
|
14
|
+
def initialize(opts = {})
|
15
|
+
@url = opts[:url]
|
16
|
+
@params = opts[:params]
|
17
|
+
end
|
18
|
+
|
19
|
+
def generate_signature
|
20
|
+
uri = URI.parse(@url)
|
21
|
+
signature = uri.path
|
22
|
+
query_string = uri.query
|
23
|
+
signature += '?' + query_string if !query_string.nil? && !query_string.empty?
|
24
|
+
signature += "\n"
|
25
|
+
if @params.is_a?(Hash)
|
26
|
+
params_string = HTTP.generate_query_string(@params)
|
27
|
+
signature += params_string
|
28
|
+
end
|
29
|
+
signature
|
30
|
+
end
|
31
|
+
|
32
|
+
def generate_token
|
33
|
+
encoded_digest = generate_encoded_digest(generate_signature)
|
34
|
+
%Q(#{@access_key}:#{encoded_digest})
|
35
|
+
end
|
36
|
+
|
37
|
+
end # module QboxToken
|
38
|
+
end # module Qiniu
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'qiniu/tokens/access_token'
|
5
|
+
require 'qiniu/utils'
|
6
|
+
require 'qiniu/helper'
|
7
|
+
|
8
|
+
### UploadToken 类已经过时,请改用 Qiniu::Auth.generate_uptoken 方法 ###
|
9
|
+
|
10
|
+
module Qiniu
|
11
|
+
class UploadToken < AccessToken
|
12
|
+
|
13
|
+
include Helper
|
14
|
+
include Utils
|
15
|
+
|
16
|
+
attr_accessor :scope, :expires_in, :callback_url, :callback_body, :callback_body_type, :customer, :escape, :async_options, :return_body, :return_url
|
17
|
+
|
18
|
+
def initialize(opts = {})
|
19
|
+
@scope = opts[:scope]
|
20
|
+
@expires_in = opts[:expires_in] || 3600
|
21
|
+
@callback_url = opts[:callback_url]
|
22
|
+
@callback_body = opts[:callback_body]
|
23
|
+
@callback_body_type = opts[:callback_body_type]
|
24
|
+
@customer = opts[:customer]
|
25
|
+
@escape = opts[:escape]
|
26
|
+
@persistent_ops = opts[:persistent_ops]
|
27
|
+
@persistent_notify_url = opts[:persistent_notify_url]
|
28
|
+
@persistent_pipeline = opts[:persistent_pipeline]
|
29
|
+
@return_body = opts[:return_body]
|
30
|
+
@return_url = opts[:return_url]
|
31
|
+
end
|
32
|
+
|
33
|
+
def generate_signature
|
34
|
+
params = {:scope => @scope, :deadline => get_expire_time.to_i + @expires_in}
|
35
|
+
params[:callbackUrl] = @callback_url if !@callback_url.nil? && !@callback_url.empty?
|
36
|
+
params[:callbackBody] = @callback_body if !@callback_body.nil? && !@callback_body.empty?
|
37
|
+
params[:callbackBodyType] = @callback_body_type if !@callback_body_type.nil? && !@callback_body_type.empty?
|
38
|
+
params[:customer] = @customer if !@customer.nil? && !@customer.empty?
|
39
|
+
params[:escape] = 1 if @escape == 1 || @escape == true
|
40
|
+
params[:returnBody] = @return_body if !@return_body.nil? && !@return_body.empty?
|
41
|
+
params[:returnUrl] = @return_url if !@return_url.nil? && !@return_url.empty?
|
42
|
+
|
43
|
+
params[:persistentOps] = @persistent_ops if !@persistent_ops.nil? && !@persistent_ops.empty?
|
44
|
+
params[:persistentNotifyUrl] = @persistent_notify_url if !@persistent_notify_url.nil? && !@persistent_notify_url.empty?
|
45
|
+
params[:persistentPipeline] = @persistent_pipeline if !@persistent_pipeline.nil? && !@persistent_pipeline.empty?
|
46
|
+
|
47
|
+
Utils.urlsafe_base64_encode(params.to_json)
|
48
|
+
end
|
49
|
+
|
50
|
+
def generate_token
|
51
|
+
signature = generate_signature
|
52
|
+
encoded_digest = generate_encoded_digest(signature)
|
53
|
+
%Q(#{@access_key}:#{encoded_digest}:#{signature})
|
54
|
+
end
|
55
|
+
|
56
|
+
end # module UploadToken
|
57
|
+
end # module Qiniu
|
data/lib/qiniu/upload.rb
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# vim: sw=2 ts=2
|
3
|
+
|
4
|
+
module Qiniu
|
5
|
+
module Storage
|
6
|
+
class << self
|
7
|
+
include Utils
|
8
|
+
|
9
|
+
def upload_with_token(uptoken,
|
10
|
+
local_file,
|
11
|
+
bucket,
|
12
|
+
key = nil,
|
13
|
+
mime_type = nil,
|
14
|
+
custom_meta = nil,
|
15
|
+
callback_params = nil,
|
16
|
+
enable_crc32_check = false,
|
17
|
+
rotate = nil)
|
18
|
+
action_params = _generate_action_params(
|
19
|
+
local_file,
|
20
|
+
bucket,
|
21
|
+
key,
|
22
|
+
mime_type,
|
23
|
+
custom_meta,
|
24
|
+
enable_crc32_check,
|
25
|
+
rotate
|
26
|
+
)
|
27
|
+
|
28
|
+
if callback_params.nil?
|
29
|
+
callback_params = {:bucket => bucket, :key => key, :mime_type => mime_type}
|
30
|
+
end
|
31
|
+
callback_query_string = HTTP.generate_query_string(callback_params)
|
32
|
+
|
33
|
+
url = Config.settings[:up_host] + '/upload'
|
34
|
+
post_data = {
|
35
|
+
:params => callback_query_string,
|
36
|
+
:action => action_params,
|
37
|
+
:file => File.new(local_file, 'rb'),
|
38
|
+
:multipart => true
|
39
|
+
}
|
40
|
+
if !uptoken.nil? then
|
41
|
+
post_data[:auth] = uptoken unless uptoken.nil?
|
42
|
+
end
|
43
|
+
|
44
|
+
return HTTP.api_post(url, post_data)
|
45
|
+
end # upload_with_token
|
46
|
+
|
47
|
+
def upload_with_token_2(uptoken,
|
48
|
+
local_file,
|
49
|
+
key = nil,
|
50
|
+
x_vars = nil,
|
51
|
+
opts = {})
|
52
|
+
### 构造URL
|
53
|
+
url = Config.settings[:up_host]
|
54
|
+
url[/\/*$/] = ''
|
55
|
+
url += '/'
|
56
|
+
|
57
|
+
### 构造HTTP Body
|
58
|
+
file = File.new(local_file, 'rb')
|
59
|
+
if not opts[:content_type].nil?
|
60
|
+
file.define_singleton_method("content_type") do
|
61
|
+
opts[:content_type]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
post_data = {
|
66
|
+
:file => file,
|
67
|
+
:multipart => true,
|
68
|
+
}
|
69
|
+
if not uptoken.nil?
|
70
|
+
post_data[:token] = uptoken
|
71
|
+
end
|
72
|
+
if not key.nil?
|
73
|
+
post_data[:key] = key
|
74
|
+
end
|
75
|
+
if x_vars.is_a?(Hash)
|
76
|
+
post_data.merge!(x_vars)
|
77
|
+
end
|
78
|
+
|
79
|
+
### 发送请求
|
80
|
+
HTTP.api_post(url, post_data)
|
81
|
+
end # upload_with_token_2
|
82
|
+
|
83
|
+
### 授权举例
|
84
|
+
# put_policy.bucket | put_policy.key | key | 语义 | 授权
|
85
|
+
# :---------------- | :------------- | :------ | :--- | :---
|
86
|
+
# trivial_bucket | <nil> | <nil> | 新增 | 允许,最终key为1)使用put_policy.save_key生成的值或2)资源内容的Hash值
|
87
|
+
# trivial_bucket | <nil> | foo.txt | 新增 | 允许
|
88
|
+
# trivial_bucket | <nil> | bar.jpg | 新增 | 允许
|
89
|
+
# trivial_bucket | foo.txt | <nil> | 覆盖 | 允许,由SDK将put_policy.key赋值给key实现
|
90
|
+
# trivial_bucket | foo.txt | foo.txt | 覆盖 | 允许
|
91
|
+
# trivial_bucket | foo.txt | bar.jpg | 覆盖 | 禁止,put_policy.key与key不一致
|
92
|
+
def upload_with_put_policy(put_policy,
|
93
|
+
local_file,
|
94
|
+
key = nil,
|
95
|
+
x_vars = nil,
|
96
|
+
opts = {})
|
97
|
+
uptoken = Auth.generate_uptoken(put_policy)
|
98
|
+
if key.nil? then
|
99
|
+
key = put_policy.key
|
100
|
+
end
|
101
|
+
|
102
|
+
return upload_with_token_2(uptoken, local_file, key, x_vars, opts)
|
103
|
+
end # upload_with_put_policy
|
104
|
+
|
105
|
+
private
|
106
|
+
def _generate_action_params(local_file,
|
107
|
+
bucket,
|
108
|
+
key = nil,
|
109
|
+
mime_type = nil,
|
110
|
+
custom_meta = nil,
|
111
|
+
enable_crc32_check = false,
|
112
|
+
rotate = nil)
|
113
|
+
raise NoSuchFileError, local_file unless File.exist?(local_file)
|
114
|
+
|
115
|
+
if key.nil?
|
116
|
+
key = Digest::SHA1.hexdigest(local_file + Time.now.to_s)
|
117
|
+
end
|
118
|
+
|
119
|
+
entry_uri = bucket + ':' + key
|
120
|
+
if mime_type.nil? || mime_type.empty?
|
121
|
+
mime = MIME::Types.type_for local_file
|
122
|
+
mime_type = mime.empty? ? 'application/octet-stream' : mime[0].content_type
|
123
|
+
end
|
124
|
+
|
125
|
+
action_params = '/rs-put/' + Utils.urlsafe_base64_encode(entry_uri) + '/mimeType/' + Utils.urlsafe_base64_encode(mime_type)
|
126
|
+
action_params += '/meta/' + Utils.urlsafe_base64_encode(custom_meta) unless custom_meta.nil?
|
127
|
+
action_params += '/crc32/' + Utils.crc32checksum(local_file).to_s if enable_crc32_check
|
128
|
+
action_params += '/rotate/' + rotate if !rotate.nil? && rotate.to_i >= 0
|
129
|
+
action_params
|
130
|
+
end # _generate_action_params
|
131
|
+
|
132
|
+
end # class << self
|
133
|
+
end # module Storage
|
134
|
+
end # module Qiniu
|
data/lib/qiniu/utils.rb
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'uri'
|
4
|
+
require 'cgi'
|
5
|
+
require 'json'
|
6
|
+
require 'zlib'
|
7
|
+
require 'base64'
|
8
|
+
require 'rest_client'
|
9
|
+
require 'hmac-sha1'
|
10
|
+
require 'qiniu/exceptions'
|
11
|
+
|
12
|
+
module Qiniu
|
13
|
+
module Utils extend self
|
14
|
+
|
15
|
+
def urlsafe_base64_encode content
|
16
|
+
Base64.encode64(content).strip.gsub('+', '-').gsub('/','_').gsub(/\r?\n/, '')
|
17
|
+
end
|
18
|
+
|
19
|
+
def urlsafe_base64_decode encoded_content
|
20
|
+
Base64.decode64 encoded_content.gsub('_','/').gsub('-', '+')
|
21
|
+
end
|
22
|
+
|
23
|
+
def encode_entry_uri(bucket, key)
|
24
|
+
entry_uri = bucket + ':' + key
|
25
|
+
urlsafe_base64_encode(entry_uri)
|
26
|
+
end
|
27
|
+
|
28
|
+
def safe_json_parse(data)
|
29
|
+
JSON.parse(data)
|
30
|
+
rescue JSON::ParserError
|
31
|
+
{}
|
32
|
+
end
|
33
|
+
|
34
|
+
def debug(msg)
|
35
|
+
if Config.settings[:enable_debug]
|
36
|
+
Log.logger.debug(msg)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
### 已过时,仅作为兼容接口保留
|
41
|
+
def send_request_with url, data = nil, options = {}
|
42
|
+
options[:method] = Config.settings[:method] unless options[:method]
|
43
|
+
options[:content_type] = Config.settings[:content_type] unless options[:content_type]
|
44
|
+
header_options = {
|
45
|
+
:accept => :json,
|
46
|
+
:user_agent => Config.settings[:user_agent]
|
47
|
+
}
|
48
|
+
auth_token = nil
|
49
|
+
if !options[:qbox_signature_token].nil? && !options[:qbox_signature_token].empty?
|
50
|
+
auth_token = 'QBox ' + options[:qbox_signature_token]
|
51
|
+
elsif !options[:upload_signature_token].nil? && !options[:upload_signature_token].empty?
|
52
|
+
auth_token = 'UpToken ' + options[:upload_signature_token]
|
53
|
+
elsif options[:access_token]
|
54
|
+
auth_token = 'Bearer ' + options[:access_token]
|
55
|
+
end
|
56
|
+
header_options.merge!('Authorization' => auth_token) unless auth_token.nil?
|
57
|
+
case options[:method]
|
58
|
+
when :get
|
59
|
+
response = RestClient.get(url, header_options)
|
60
|
+
when :post
|
61
|
+
header_options.merge!(:content_type => options[:content_type])
|
62
|
+
response = RestClient.post(url, data, header_options)
|
63
|
+
end
|
64
|
+
code = response.respond_to?(:code) ? response.code.to_i : 0
|
65
|
+
unless HTTP.is_response_ok?(code)
|
66
|
+
raise RequestFailed.new("Request Failed", response)
|
67
|
+
else
|
68
|
+
data = {}
|
69
|
+
body = response.respond_to?(:body) ? response.body : {}
|
70
|
+
raw_headers = response.respond_to?(:raw_headers) ? response.raw_headers : {}
|
71
|
+
data = safe_json_parse(body) unless body.empty?
|
72
|
+
end
|
73
|
+
[code, data, raw_headers]
|
74
|
+
end # send_request_with
|
75
|
+
|
76
|
+
### 已过时,仅作为兼容接口保留
|
77
|
+
def http_request url, data = nil, options = {}
|
78
|
+
retry_times = 0
|
79
|
+
begin
|
80
|
+
retry_times += 1
|
81
|
+
send_request_with url, data, options
|
82
|
+
rescue Errno::ECONNRESET => err
|
83
|
+
if Config.settings[:auto_reconnect] && retry_times < Config.settings[:max_retry_times]
|
84
|
+
retry
|
85
|
+
else
|
86
|
+
Log.logger.error err
|
87
|
+
end
|
88
|
+
rescue => e
|
89
|
+
Log.logger.warn "#{e.message} => Utils.http_request('#{url}')"
|
90
|
+
code = 0
|
91
|
+
data = {}
|
92
|
+
body = {}
|
93
|
+
if e.respond_to? :response
|
94
|
+
res = e.response
|
95
|
+
code = res.code.to_i if res.respond_to? :code
|
96
|
+
body = res.respond_to?(:body) ? res.body : ""
|
97
|
+
raw_headers = res.respond_to?(:raw_headers) ? res.raw_headers : {}
|
98
|
+
data = safe_json_parse(body) unless body.empty?
|
99
|
+
end
|
100
|
+
[code, data, raw_headers]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def crc32checksum(filepath)
|
105
|
+
File.open(filepath, "rb") { |f| Zlib.crc32 f.read }
|
106
|
+
end
|
107
|
+
|
108
|
+
end # module Utils
|
109
|
+
end # module Qiniu
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Qiniu
|
4
|
+
module Version
|
5
|
+
MAJOR = 6
|
6
|
+
MINOR = 4
|
7
|
+
PATCH = 2
|
8
|
+
# Returns a version string by joining <tt>MAJOR</tt>, <tt>MINOR</tt>, and <tt>PATCH</tt> with <tt>'.'</tt>
|
9
|
+
#
|
10
|
+
# Example
|
11
|
+
#
|
12
|
+
# Version.to_s # '1.0.2'
|
13
|
+
def self.to_s
|
14
|
+
[MAJOR, MINOR, PATCH].join('.')
|
15
|
+
end
|
16
|
+
end # Version
|
17
|
+
end # module Qiniu
|
data/lib/qiniu-rs.rb
ADDED
data/lib/qiniu.rb
ADDED
@@ -0,0 +1,209 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Qiniu
|
4
|
+
autoload :Version, 'qiniu/version'
|
5
|
+
autoload :Utils, 'qiniu/utils'
|
6
|
+
autoload :Auth, 'qiniu/auth'
|
7
|
+
autoload :Config, 'qiniu/config'
|
8
|
+
autoload :Log, 'qiniu/log'
|
9
|
+
autoload :Exception, 'qiniu/exceptions'
|
10
|
+
autoload :AccessToken, 'qiniu/tokens/access_token'
|
11
|
+
autoload :QboxToken, 'qiniu/tokens/qbox_token'
|
12
|
+
autoload :UploadToken, 'qiniu/tokens/upload_token'
|
13
|
+
autoload :DownloadToken, 'qiniu/tokens/download_token'
|
14
|
+
autoload :Abstract, 'qiniu/abstract'
|
15
|
+
autoload :Storage, 'qiniu/storage'
|
16
|
+
autoload :Fop, 'qiniu/fop'
|
17
|
+
autoload :Misc, 'qiniu/misc'
|
18
|
+
|
19
|
+
class << self
|
20
|
+
|
21
|
+
StatusOK = 200
|
22
|
+
|
23
|
+
def establish_connection!(opts = {})
|
24
|
+
Config.initialize_connect opts
|
25
|
+
end
|
26
|
+
|
27
|
+
def mkbucket(bucket_name)
|
28
|
+
code, data = Storage.mkbucket(bucket_name)
|
29
|
+
code == StatusOK
|
30
|
+
end
|
31
|
+
|
32
|
+
def buckets
|
33
|
+
code, data = Storage.buckets
|
34
|
+
code == StatusOK ? data : false
|
35
|
+
end
|
36
|
+
|
37
|
+
def set_protected(bucket, protected_mode)
|
38
|
+
code, data = Misc.set_protected(bucket, protected_mode)
|
39
|
+
code == StatusOK
|
40
|
+
end
|
41
|
+
|
42
|
+
def set_separator(bucket, separator)
|
43
|
+
code, data = Misc.set_separator(bucket, separator)
|
44
|
+
code == StatusOK
|
45
|
+
end
|
46
|
+
|
47
|
+
def set_style(bucket, name, style)
|
48
|
+
code, data = Misc.set_style(bucket, name, style)
|
49
|
+
code == StatusOK
|
50
|
+
end
|
51
|
+
|
52
|
+
def unset_style(bucket, name)
|
53
|
+
code, data = Misc.unset_style(bucket, name)
|
54
|
+
code == StatusOK
|
55
|
+
end
|
56
|
+
|
57
|
+
def upload_file opts = {}
|
58
|
+
uncontained_opts = [:uptoken, :file, :bucket, :key] - opts.keys
|
59
|
+
raise MissingArgsError, uncontained_opts unless uncontained_opts.empty?
|
60
|
+
|
61
|
+
source_file = opts[:file]
|
62
|
+
raise NoSuchFileError, source_file unless File.exist?(source_file)
|
63
|
+
|
64
|
+
opts[:enable_resumable_upload] = true unless opts.has_key?(:enable_resumable_upload)
|
65
|
+
|
66
|
+
if opts[:enable_resumable_upload] && File::size(source_file) > Config.settings[:block_size]
|
67
|
+
code, data, raw_headers = Storage.upload_with_token(opts[:uptoken],
|
68
|
+
opts[:file],
|
69
|
+
opts[:bucket],
|
70
|
+
opts[:key],
|
71
|
+
opts[:mime_type],
|
72
|
+
opts[:note],
|
73
|
+
opts[:customer],
|
74
|
+
opts[:callback_params],
|
75
|
+
opts[:rotate])
|
76
|
+
else
|
77
|
+
code, data, raw_headers = Storage.upload_with_token(opts[:uptoken],
|
78
|
+
opts[:file],
|
79
|
+
opts[:bucket],
|
80
|
+
opts[:key],
|
81
|
+
opts[:mime_type],
|
82
|
+
opts[:note],
|
83
|
+
opts[:callback_params],
|
84
|
+
opts[:enable_crc32_check],
|
85
|
+
opts[:rotate])
|
86
|
+
end
|
87
|
+
raise UploadFailedError.new(code, data) if code != StatusOK
|
88
|
+
return data
|
89
|
+
end
|
90
|
+
|
91
|
+
def stat(bucket, key)
|
92
|
+
code, data = Storage.stat(bucket, key)
|
93
|
+
code == StatusOK ? data : false
|
94
|
+
end
|
95
|
+
|
96
|
+
def get(bucket, key, save_as = nil, expires_in = nil, version = nil)
|
97
|
+
code, data = Storage.get(bucket, key, save_as, expires_in, version)
|
98
|
+
code == StatusOK ? data : false
|
99
|
+
end
|
100
|
+
|
101
|
+
def download(bucket, key, save_as = nil, expires_in = nil, version = nil)
|
102
|
+
code, data = Storage.get(bucket, key, save_as, expires_in, version)
|
103
|
+
code == StatusOK ? data["url"] : false
|
104
|
+
end
|
105
|
+
|
106
|
+
def copy(source_bucket, source_key, target_bucket, target_key)
|
107
|
+
code, data = Storage.copy(source_bucket, source_key, target_bucket, target_key)
|
108
|
+
code == StatusOK
|
109
|
+
end
|
110
|
+
|
111
|
+
def move(source_bucket, source_key, target_bucket, target_key)
|
112
|
+
code, data = Storage.move(source_bucket, source_key, target_bucket, target_key)
|
113
|
+
code == StatusOK
|
114
|
+
end
|
115
|
+
|
116
|
+
def delete(bucket, key)
|
117
|
+
code, data = Storage.delete(bucket, key)
|
118
|
+
code == StatusOK
|
119
|
+
end
|
120
|
+
|
121
|
+
def batch(command, bucket, keys)
|
122
|
+
code, data = Storage.batch(command, bucket, keys)
|
123
|
+
code == StatusOK ? data : false
|
124
|
+
end
|
125
|
+
|
126
|
+
def batch_stat(bucket, keys)
|
127
|
+
code, data = Storage.batch_stat(bucket, keys)
|
128
|
+
code == StatusOK ? data : false
|
129
|
+
end
|
130
|
+
|
131
|
+
def batch_get(bucket, keys)
|
132
|
+
code, data = Storage.batch_get(bucket, keys)
|
133
|
+
code == StatusOK ? data : false
|
134
|
+
end
|
135
|
+
|
136
|
+
def batch_copy(*args)
|
137
|
+
code, data = Storage.batch_copy(args)
|
138
|
+
code == StatusOK
|
139
|
+
end
|
140
|
+
|
141
|
+
def batch_move(*args)
|
142
|
+
code, data = Storage.batch_move(args)
|
143
|
+
code == StatusOK
|
144
|
+
end
|
145
|
+
|
146
|
+
def batch_download(bucket, keys)
|
147
|
+
code, data = Storage.batch_get(bucket, keys)
|
148
|
+
return false unless code == StatusOK
|
149
|
+
links = []
|
150
|
+
data.each { |e| links << e["data"]["url"] }
|
151
|
+
links
|
152
|
+
end
|
153
|
+
|
154
|
+
def batch_delete(bucket, keys)
|
155
|
+
code, data = Storage.batch_delete(bucket, keys)
|
156
|
+
code == StatusOK ? data : false
|
157
|
+
end
|
158
|
+
|
159
|
+
def drop(bucket)
|
160
|
+
code, data = Storage.drop(bucket)
|
161
|
+
code == StatusOK
|
162
|
+
end
|
163
|
+
|
164
|
+
def image_info(url)
|
165
|
+
code, data = Fop::Image.info(url)
|
166
|
+
code == StatusOK ? data : false
|
167
|
+
end
|
168
|
+
|
169
|
+
def image_exif(url)
|
170
|
+
code, data = Fop::Image.exif(url)
|
171
|
+
code == StatusOK ? data : false
|
172
|
+
end
|
173
|
+
|
174
|
+
def image_mogrify_preview_url(source_image_url, options)
|
175
|
+
Fop::Image.mogrify_preview_url(source_image_url, options)
|
176
|
+
end
|
177
|
+
|
178
|
+
def image_mogrify_save_as(bucket, key, source_image_url, options)
|
179
|
+
code, data = Storage.image_mogrify_save_as(bucket, key, source_image_url, options)
|
180
|
+
code == StatusOK ? data : false
|
181
|
+
end
|
182
|
+
|
183
|
+
def generate_upload_token(opts = {})
|
184
|
+
token_obj = UploadToken.new(opts)
|
185
|
+
token_obj.access_key = Config.settings[:access_key]
|
186
|
+
token_obj.secret_key = Config.settings[:secret_key]
|
187
|
+
#token_obj.scope = opts[:scope]
|
188
|
+
#token_obj.expires_in = opts[:expires_in]
|
189
|
+
#token_obj.callback_url = opts[:callback_url]
|
190
|
+
#token_obj.callback_body_type = opts[:callback_body_type]
|
191
|
+
#token_obj.customer = opts[:customer]
|
192
|
+
#token_obj.escape = opts[:escape]
|
193
|
+
#token_obj.async_options = opts[:async_options]
|
194
|
+
#token_obj.return_body = opts[:return_body]
|
195
|
+
token_obj.generate_token
|
196
|
+
end
|
197
|
+
|
198
|
+
def generate_download_token(opts = {})
|
199
|
+
token_obj = DownloadToken.new(opts)
|
200
|
+
token_obj.access_key = Config.settings[:access_key]
|
201
|
+
token_obj.secret_key = Config.settings[:secret_key]
|
202
|
+
#token_obj.expires_in = opts[:expires_in]
|
203
|
+
#token_obj.pattern = opts[:pattern]
|
204
|
+
token_obj.generate_token
|
205
|
+
end
|
206
|
+
|
207
|
+
end
|
208
|
+
|
209
|
+
end # module Qiniu
|
data/qiniu.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path('../lib/qiniu/version', __FILE__)
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.authors = ["why404","BluntBlade"]
|
7
|
+
gem.email = ["sdk@qiniu.com"]
|
8
|
+
gem.description = %q{Qiniu Resource (Cloud) Storage SDK for Ruby. See: http://developer.qiniu.com/docs/v6/sdk/ruby-sdk.html}
|
9
|
+
gem.summary = %q{Qiniu Resource (Cloud) Storage SDK for Ruby}
|
10
|
+
gem.homepage = "https://github.com/qiniu/ruby-sdk"
|
11
|
+
|
12
|
+
gem.files = `git ls-files`.split($\)
|
13
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
14
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
15
|
+
gem.name = "qiniu_jxb_fix"
|
16
|
+
gem.require_paths = ["lib"]
|
17
|
+
gem.version = Qiniu::Version.to_s
|
18
|
+
gem.license = "MIT"
|
19
|
+
|
20
|
+
# specify any dependencies here; for example:
|
21
|
+
gem.add_development_dependency "rake", ">= 0.9"
|
22
|
+
gem.add_development_dependency "rspec", ">= 2.11"
|
23
|
+
gem.add_development_dependency "fakeweb", "~> 1.3"
|
24
|
+
gem.add_runtime_dependency "json", "~> 1.7"
|
25
|
+
gem.add_runtime_dependency "rest-client", "~> 1.6"
|
26
|
+
gem.add_runtime_dependency "mime-types", "~> 1.19"
|
27
|
+
gem.add_runtime_dependency "ruby-hmac", "~> 0.4"
|
28
|
+
gem.add_runtime_dependency "jruby-openssl", "~> 0.7" if RUBY_PLATFORM == "java"
|
29
|
+
end
|
data/rails3/Gemfile
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path('../../lib/qiniu/version', __FILE__)
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.authors = ["why404","BluntBlade"]
|
7
|
+
gem.email = ["sdk@qiniu.com"]
|
8
|
+
gem.description = %q{Qiniu Resource (Cloud) Storage SDK for Ruby. See: http://developer.qiniu.com/docs/v6/sdk/ruby-sdk.html}
|
9
|
+
gem.summary = %q{Qiniu Resource (Cloud) Storage SDK for Ruby}
|
10
|
+
gem.homepage = "https://github.com/qiniu/ruby-sdk"
|
11
|
+
|
12
|
+
gem.files = `git ls-files`.split($\)
|
13
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
14
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
15
|
+
gem.name = "qiniu"
|
16
|
+
gem.require_paths = ["lib"]
|
17
|
+
gem.version = Qiniu::Version.to_s
|
18
|
+
gem.license = "MIT"
|
19
|
+
|
20
|
+
# specify any dependencies here; for example:
|
21
|
+
gem.add_development_dependency "rake", ">= 0.9"
|
22
|
+
gem.add_development_dependency "rspec", ">= 2.11"
|
23
|
+
gem.add_development_dependency "fakeweb", "~> 1.3"
|
24
|
+
gem.add_runtime_dependency "json", "~> 1.8"
|
25
|
+
gem.add_runtime_dependency "rest-client", "~> 1.7.3"
|
26
|
+
gem.add_runtime_dependency "mime-types", "~> 1.19"
|
27
|
+
gem.add_runtime_dependency "ruby-hmac", "~> 0.4"
|
28
|
+
gem.add_runtime_dependency "jruby-openssl", "~> 0.7" if RUBY_PLATFORM == "java"
|
29
|
+
end
|