qiniu-rs 2.2.1 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- qiniu-rs (2.2.1)
4
+ qiniu-rs (2.3.0)
5
5
  json (~> 1.7.3)
6
6
  mime-types (~> 1.19)
7
7
  rest-client (~> 1.6.7)
data/docs/README.md CHANGED
@@ -14,8 +14,10 @@ title: Ruby SDK 使用指南 | 七牛云存储
14
14
  - [使用](#Usage)
15
15
  - [应用接入](#establish_connection!)
16
16
  - [Ruby On Rails 应用初始化设置](#ror-init)
17
- - [获取用于上传文件的临时授权URL](#put_auth)
18
17
  - [上传文件](#upload)
18
+ - [服务端上传流程](#upload-server-side)
19
+ - [客户端上传流程](#upload-client-side)
20
+ - [获取用于上传文件的临时授权URL](#put_auth)
19
21
  - [查看文件属性信息](#stat)
20
22
  - [获取文件下载链接(含文件属性信息)](#get)
21
23
  - [只获取文件下载链接](#download)
@@ -88,51 +90,24 @@ title: Ruby SDK 使用指南 | 七牛云存储
88
90
 
89
91
  接下来,我们会逐一介绍此 SDK 提供的其他方法。
90
92
 
91
- <a name="put_auth"></a>
92
-
93
- ### 获取用于上传文件的临时授权URL
94
-
95
- Qiniu::RS.put_auth(expires_in = nil, callback_url = nil)
96
-
97
- 要上传一个文件,首先需要调用 SDK 提供的 `Qiniu::RS.put_auth` 函数来获取一个经过授权用于临时匿名上传的 URL 。 “临时” 一词表示该 URL 有一定的时效性,即过一段时间后会过期,有效期由传入的参数 `expires_in` 决定,缺省情况下 `expires_in` 的值是 3600 秒,即 1 小时后该上传链接不再有效(但该上传URL在其生成之后的59分59秒都是可用的)。
98
-
99
- **参数**
100
-
101
- expires_in
102
- : 可选,整型,用于设置上传 URL 的有效期,单位:秒,缺省为 3600 秒
103
-
104
- callback_url
105
- : 可选,字符串类型(String),用于设置文件往这个 URL 上传成功后,七牛云存储服务端要回调客户方的业务服务器地址。
106
-
107
- **返回值**
108
-
109
- 如果请求成功,返回一个字符串类型(String)的用于上传文件的已授权的临时有效 URL ,否则返回 `false` 。
110
-
111
- **示例**
112
-
113
- remote_upload_url = Qiniu::RS.put_auth(60, 'http://api.example.com/notifications/qiniu-rs')
114
-
115
- 如果您的网络程序是从云端(服务端程序)到终端(手持设备应用)的架构模型,且终端用户有使用您移动端App上传文件(比如照片或视频)的需求,可以把您服务器得到的此 `remote_upload_url` 返回给手持设备端的App,然后您的移动 App 可以使用 [七牛云存储 Objective-SDK (iOS)](http://docs.qiniutek.com/v2/sdk/objc/) 或 [七牛云存储 Java-SDK(Android)](http://docs.qiniutek.com/v2/sdk/java/) 的相关上传函数或参照 [七牛云存储API之文件上传](http://docs.qiniutek.com/v2/api/io/#rs-PutFile) 往该 `remote_upload_url` 上传文件。这样,您的终端用户即可把数据(比如图片或视频)直接上传到七牛云存储服务器上无须经由您的服务端中转,而且在上传之前,七牛云存储做了智能加速,终端用户上传数据始终是离他物理距离最近的存储节点。当终端用户上传成功后,七牛云存储服务端会向您指定的 `callback_url` 发送回调数据。在此示例程序中,七牛云存储服务端会将一组关于终端用户上传的数据的属性信息通过 HTTP POST 以 application/x-www-form-urlencoded 编码的方式发送到 `http://api.example.com/notifications/qiniu-rs` 这个地址,假设该地址是您业务服务器用于接收处理回调信息的地址。
116
-
117
93
  <a name="upload"></a>
118
94
 
119
95
  ### 上传文件
120
96
 
121
- 通过 `Qiniu::RS.put_auth` 函数取得 `remote_upload_url` 之后,即可往该 URL 上传 multipart/form-data 编码格式的数据流。前面讲解了移动 App 拿到 `remote_upload_url` 之后上传数据的流程,如果您的服务端需要上传数据,依然可以使用此 SDK 提供的 `Qiniu::RS.upload` 函数。该函数规格如下:
97
+ <a name="upload-server-side"></a>
122
98
 
123
- Qiniu::RS.upload :url => remote_upload_url,
124
- :file => file_path,
125
- :key => record_id,
126
- :bucket => bucket_name,
127
- :mime_type => file_mime_type,
128
- :note => some_notes,
129
- :callback_params => {},
130
- :enable_crc32_check => true
99
+ #### 服务端上传流程
131
100
 
132
- **参数**
101
+ 通过 `Qiniu::RS.put_file()` 方法可在客户方的业务服务器上直接往七牛云存储上传文件。该函数规格如下:
133
102
 
134
- :url
135
- : 必须,即通过 `Qiniu::RS.put_auth` 函数取得 `remote_upload_url`
103
+ Qiniu::RS.put_file :file => file_path,
104
+ :key => record_id,
105
+ :bucket => bucket_name,
106
+ :mime_type => file_mime_type,
107
+ :note => some_notes,
108
+ :enable_crc32_check => true
109
+
110
+ **参数**
136
111
 
137
112
  :file
138
113
  : 必须,字符串类型(String),本地文件可被读取的有效路径
@@ -149,9 +124,6 @@ callback_url
149
124
  :note
150
125
  : 可选,字符串类型(String),备注信息。
151
126
 
152
- :callback_params
153
- : 可选,k/v 对的 Hash 结构,缺省为:`{:bucket => bucket, :key => key, :mime_type => mime_type}`,用于七牛云存储服务端通过 HTTP POST 以 application/x-www-form-urlencoded 编码的方式发送到 `Qiniu::RS.put_auth` 函数指定的 `callback_url` 。
154
-
155
127
  :enable_crc32_check
156
128
  : 可选,Boolean 类型,是否启用文件上传 crc32 校验,默认为 false 。
157
129
 
@@ -161,7 +133,38 @@ callback_url
161
133
 
162
134
  **针对 NotFound 处理**
163
135
 
164
- 您可以上传一个应对 HTTP 404 出错处理的文件,当您 [创建公开外链](#publish) 后,若公开的外链找不到该文件,即可使用您上传的“自定义404文件”代替之。要这么做,您只须使用 `Qiniu::RS.upload` 函数上传一个 `key` 为固定字符串类型的值 `errno-404` 即可。
136
+ 您可以上传一个应对 HTTP 404 出错处理的文件,当您 [创建公开外链](#publish) 后,若公开的外链找不到该文件,即可使用您上传的“自定义404文件”代替之。要这么做,您只须使用 `Qiniu::RS.put_file` 函数上传一个 `key` 为固定字符串类型的值 `errno-404` 即可。
137
+
138
+ <a name="upload-client-side"></a>
139
+
140
+ #### 客户端上传流程
141
+
142
+ <a name="put_auth"></a>
143
+
144
+ #### 获取用于上传文件的临时授权URL
145
+
146
+ Qiniu::RS.put_auth(expires_in = nil, callback_url = nil)
147
+
148
+ 要上传一个文件,首先需要调用 SDK 提供的 `Qiniu::RS.put_auth` 函数来获取一个经过授权用于临时匿名上传的 URL 。 “临时” 一词表示该 URL 有一定的时效性,即过一段时间后会过期,有效期由传入的参数 `expires_in` 决定,缺省情况下 `expires_in` 的值是 3600 秒,即 1 小时后该上传链接不再有效(但该上传URL在其生成之后的59分59秒都是可用的)。
149
+
150
+ **参数**
151
+
152
+ expires_in
153
+ : 可选,整型,用于设置上传 URL 的有效期,单位:秒,缺省为 3600 秒
154
+
155
+ callback_url
156
+ : 可选,字符串类型(String),用于设置文件往这个 URL 上传成功后,七牛云存储服务端要回调客户方的业务服务器地址。
157
+
158
+ **返回值**
159
+
160
+ 如果请求成功,返回一个字符串类型(String)的用于上传文件的已授权的临时有效 URL ,否则返回 `false` 。
161
+
162
+ **示例**
163
+
164
+ remote_upload_url = Qiniu::RS.put_auth(60, 'http://api.example.com/notifications/qiniu-rs')
165
+
166
+ 如果您的网络程序是从云端(服务端程序)到终端(手持设备应用)的架构模型,且终端用户有使用您移动端App上传文件(比如照片或视频)的需求,可以把您服务器得到的此 `remote_upload_url` 返回给手持设备端的App,然后您的移动 App 可以使用 [七牛云存储 Objective-SDK (iOS)](http://docs.qiniutek.com/v2/sdk/objc/) 或 [七牛云存储 Java-SDK(Android)](http://docs.qiniutek.com/v2/sdk/java/) 的相关上传函数或参照 [七牛云存储API之文件上传](http://docs.qiniutek.com/v2/api/io/#rs-PutFile) 往该 `remote_upload_url` 上传文件。这样,您的终端用户即可把数据(比如图片或视频)直接上传到七牛云存储服务器上无须经由您的服务端中转,而且在上传之前,七牛云存储做了智能加速,终端用户上传数据始终是离他物理距离最近的存储节点。当终端用户上传成功后,七牛云存储服务端会向您指定的 `callback_url` 发送回调数据。在此示例程序中,七牛云存储服务端会将一组关于终端用户上传的数据的属性信息通过 HTTP POST 以 `application/x-www-form-urlencoded` 编码的方式发送到 `http://api.example.com/notifications/qiniu-rs` 这个地址,假设该地址是您业务服务器用于接收处理回调信息的地址。
167
+
165
168
 
166
169
  <a name="stat"></a>
167
170
 
data/lib/qiniu/rs.rb CHANGED
@@ -35,13 +35,23 @@ module Qiniu
35
35
  end
36
36
 
37
37
  def upload opts = {}
38
- code, data = IO.put_file(opts[:url],
39
- opts[:file],
38
+ code, data = IO.upload_file(opts[:url],
39
+ opts[:file],
40
+ opts[:bucket],
41
+ opts[:key],
42
+ opts[:mime_type],
43
+ opts[:note],
44
+ opts[:callback_params],
45
+ opts[:enable_crc32_check])
46
+ code == StatusOK
47
+ end
48
+
49
+ def put_file opts = {}
50
+ code, data = IO.put_file(opts[:file],
40
51
  opts[:bucket],
41
52
  opts[:key],
42
53
  opts[:mime_type],
43
54
  opts[:note],
44
- opts[:callback_params],
45
55
  opts[:enable_crc32_check])
46
56
  code == StatusOK
47
57
  end
data/lib/qiniu/rs/io.rb CHANGED
@@ -20,20 +20,34 @@ module Qiniu
20
20
  Auth.request(url)
21
21
  end
22
22
 
23
- def put_file(url, local_file, bucket = nil, key = nil, mime_type = nil, custom_meta = nil, callback_params = nil, enable_crc32_check = false)
23
+ def upload_file(url, local_file, bucket, key = nil, mime_type = nil, custom_meta = nil, callback_params = nil, enable_crc32_check = false)
24
+ action_params = _generate_action_params(local_file, bucket, key, mime_type, custom_meta, enable_crc32_check)
25
+ callback_params = {:bucket => bucket, :key => key, :mime_type => mime_type} if callback_params.nil?
26
+ callback_query_string = Utils.generate_query_string(callback_params)
27
+ Utils.upload_multipart_data(url, local_file, action_params, callback_query_string)
28
+ end
29
+
30
+ def put_file(local_file, bucket, key = nil, mime_type = nil, custom_meta = nil, enable_crc32_check = false)
31
+ action_params = _generate_action_params(local_file, bucket, key, mime_type, custom_meta, enable_crc32_check)
32
+ url = Config.settings[:io_host] + action_params
33
+ post_data = {:file => File.new(local_file, 'rb'), :multipart => true}
34
+ options = {:qbox_signature_token => Utils.generate_qbox_signature(url, nil)}
35
+ Utils.send_multipart_request url, post_data, options
36
+ end
37
+
38
+ private
39
+ def _generate_action_params(local_file, bucket, key = nil, mime_type = nil, custom_meta = nil, enable_crc32_check = false)
24
40
  raise NoSuchFileError, local_file unless File.exist?(local_file)
25
41
  key = Digest::SHA1.hexdigest(local_file + Time.now.to_s) if key.nil?
26
42
  entry_uri = bucket + ':' + key
27
- if mime_type.nil?
43
+ if mime_type.nil? || mime_type.empty?
28
44
  mime = MIME::Types.type_for local_file
29
45
  mime_type = mime.empty? ? 'application/octet-stream' : mime[0].content_type
30
46
  end
31
47
  action_params = '/rs-put/' + Utils.urlsafe_base64_encode(entry_uri) + '/mimeType/' + Utils.urlsafe_base64_encode(mime_type)
32
48
  action_params += '/meta/' + Utils.urlsafe_base64_encode(custom_meta) unless custom_meta.nil?
33
49
  action_params += '/crc32/' + Utils.crc32checksum(local_file).to_s if enable_crc32_check
34
- callback_params = {:bucket => bucket, :key => key, :mime_type => mime_type} if callback_params.nil?
35
- callback_query_string = Utils.generate_query_string(callback_params)
36
- Utils.upload_multipart_data(url, local_file, action_params, callback_query_string)
50
+ action_params
37
51
  end
38
52
 
39
53
  end
@@ -91,19 +91,22 @@ module Qiniu
91
91
  end
92
92
  end
93
93
 
94
- def upload_multipart_data(url, filepath, action_string, callback_query_string = '')
94
+ def send_multipart_request(url, post_data, options = {})
95
95
  code, data = 0, {}
96
96
  begin
97
97
  header_options = {
98
98
  :accept => :json,
99
99
  :user_agent => Config.settings[:user_agent]
100
100
  }
101
- post_data = {
102
- :file => File.new(filepath, 'rb'),
103
- :params => callback_query_string,
104
- :action => action_string,
105
- :multipart => true
106
- }
101
+ auth_token = nil
102
+ if !options[:qbox_signature_token].nil? && !options[:qbox_signature_token].empty?
103
+ auth_token = 'QBox ' + options[:qbox_signature_token]
104
+ #elsif !options[:upload_signature_token].nil? && !options[:upload_signature_token].empty?
105
+ #auth_token = 'UpToken ' + options[:upload_signature_token]
106
+ elsif options[:access_token]
107
+ auth_token = 'Bearer ' + options[:access_token]
108
+ end
109
+ header_options.merge!('Authorization' => auth_token) unless auth_token.nil?
107
110
  response = RestClient.post url, post_data, header_options
108
111
  body = response.respond_to?(:body) ? response.body : ""
109
112
  data = safe_json_parse(body) unless body.empty?
@@ -123,6 +126,16 @@ module Qiniu
123
126
  [code, data]
124
127
  end
125
128
 
129
+ def upload_multipart_data(url, filepath, action_string, callback_query_string = '')
130
+ post_data = {
131
+ :file => File.new(filepath, 'rb'),
132
+ :params => callback_query_string,
133
+ :action => action_string,
134
+ :multipart => true
135
+ }
136
+ send_multipart_request(url, post_data)
137
+ end
138
+
126
139
  def generate_query_string(params)
127
140
  return params if params.is_a?(String)
128
141
  total_param = params.map { |key, value| key.to_s+"="+value.to_s }
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Qiniu
4
4
  module RS
5
- VERSION = "2.2.1"
5
+ VERSION = "2.3.0"
6
6
  end
7
7
  end
@@ -19,21 +19,26 @@ module Qiniu
19
19
  data["refresh_token"].should_not be_empty
20
20
  puts data.inspect
21
21
  =end
22
-
23
- code2, data2 = Qiniu::RS::IO.put_auth()
24
- code2.should == 200
25
- data2["url"].should_not be_empty
26
- data2["expiresIn"].should_not be_zero
27
- puts data2.inspect
28
-
29
- @put_url = data2["url"]
30
22
  @bucket = "test"
31
23
  @key = Digest::SHA1.hexdigest (Time.now.to_i+rand(100)).to_s
32
24
  end
33
25
 
26
+ context ".upload_file" do
27
+ it "should works" do
28
+ code, data = Qiniu::RS::IO.put_auth()
29
+ code.should == 200
30
+ data["url"].should_not be_empty
31
+ data["expiresIn"].should_not be_zero
32
+ puts data.inspect
33
+ code2, data2 = Qiniu::RS::IO.upload_file(data["url"], __FILE__, @bucket, @key)
34
+ code2.should == 200
35
+ puts data2.inspect
36
+ end
37
+ end
38
+
34
39
  context ".put_file" do
35
40
  it "should works" do
36
- code, data = Qiniu::RS::IO.put_file(@put_url, __FILE__, @bucket, @key)
41
+ code, data = Qiniu::RS::IO.put_file(__FILE__, @bucket, @key, 'application/x-ruby', 'customMeta', true)
37
42
  code.should == 200
38
43
  puts data.inspect
39
44
  end
@@ -33,9 +33,9 @@ module Qiniu
33
33
  @domain = 'cdn.example.com'
34
34
  end
35
35
 
36
- context "IO.put_file" do
36
+ context "IO.upload_file" do
37
37
  it "should works" do
38
- code, data = Qiniu::RS::IO.put_file(@put_url, __FILE__, @bucket, @key)
38
+ code, data = Qiniu::RS::IO.upload_file(@put_url, __FILE__, @bucket, @key)
39
39
  code.should == 200
40
40
  puts data.inspect
41
41
  end
@@ -43,11 +43,23 @@ module Qiniu
43
43
  :file => __FILE__,
44
44
  :bucket => @bucket,
45
45
  :key => @key,
46
+ :mime_type => 'application/x-ruby',
46
47
  :enable_crc32_check => true
47
48
  result.should be_true
48
49
  end
49
50
  end
50
51
 
52
+ context ".put_file" do
53
+ it "should works" do
54
+ result = Qiniu::RS.put_file :file => __FILE__,
55
+ :bucket => @bucket,
56
+ :key => @key,
57
+ :mime_type => 'application/x-ruby',
58
+ :enable_crc32_check => true
59
+ result.should be_true
60
+ end
61
+ end
62
+
51
63
  context ".stat" do
52
64
  it "should works" do
53
65
  result = Qiniu::RS.stat(@bucket, @key)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qiniu-rs
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 2.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-23 00:00:00.000000000 Z
12
+ date: 2012-07-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -177,7 +177,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
177
177
  version: '0'
178
178
  segments:
179
179
  - 0
180
- hash: -3300065752153229781
180
+ hash: 3610852684966438778
181
181
  required_rubygems_version: !ruby/object:Gem::Requirement
182
182
  none: false
183
183
  requirements:
@@ -186,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
186
  version: '0'
187
187
  segments:
188
188
  - 0
189
- hash: -3300065752153229781
189
+ hash: 3610852684966438778
190
190
  requirements: []
191
191
  rubyforge_project:
192
192
  rubygems_version: 1.8.24