qiniu-rs 2.1.2 → 2.2.1

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.1.2)
4
+ qiniu-rs (2.2.1)
5
5
  json (~> 1.7.3)
6
6
  mime-types (~> 1.19)
7
7
  rest-client (~> 1.6.7)
data/README.md CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  ## 许可证
34
34
 
35
- Copyright (c) 2012 why404
35
+ Copyright (c) 2012 qiniutek.com
36
36
 
37
37
  基于 MIT 协议发布:
38
38
 
data/docs/README.md ADDED
@@ -0,0 +1,634 @@
1
+ ---
2
+ title: Ruby SDK 使用指南 | 七牛云存储
3
+ ---
4
+
5
+ # Ruby SDK 使用指南
6
+
7
+ 此 Ruby SDK 适用于 Ruby 1.8.x, 1.9.x, jruby, rbx, ree 版本,基于 [七牛云存储官方API](/v2/api/) 构建。使用此 SDK 构建您的网络应用程序,能让您以非常便捷地方式将数据安全地存储到七牛云存储上。无论您的网络应用是一个网站程序,还是包括从云端(服务端程序)到终端(手持设备应用)的架构的服务或应用,通过七牛云存储及其 SDK,都能让您应用程序的终端用户高速上传和下载,同时也让您的服务端更加轻盈。
8
+
9
+ 七牛云存储 Ruby SDK 源码地址:[https://github.com/qiniu/ruby-sdk](https://github.com/qiniu/ruby-sdk)
10
+
11
+ **文档大纲**
12
+
13
+ - [安装](#Installation)
14
+ - [使用](#Usage)
15
+ - [应用接入](#establish_connection!)
16
+ - [Ruby On Rails 应用初始化设置](#ror-init)
17
+ - [获取用于上传文件的临时授权URL](#put_auth)
18
+ - [上传文件](#upload)
19
+ - [查看文件属性信息](#stat)
20
+ - [获取文件下载链接(含文件属性信息)](#get)
21
+ - [只获取文件下载链接](#download)
22
+ - [删除指定文件](#delete)
23
+ - [删除所有文件(单个“表”)](#drop)
24
+ - [批量操作](#batch)
25
+ - [批量获取文件属性信息(含下载链接)](#batch_get)
26
+ - [批量获取文件下载链接](#batch_download)
27
+ - [批量删除文件](#batch_delete)
28
+ - [创建公开外链](#publish)
29
+ - [取消公开外链](#unpublish)
30
+ - [图像处理](#op-image)
31
+ - [查看图片属性信息](#image_info)
32
+ - [获取指定规格的缩略图预览地址](#image_preview_url)
33
+ - [高级图像处理(缩略、裁剪、旋转、转化)](#image_mogrify_preview_url)
34
+ - [高级图像处理(缩略、裁剪、旋转、转化)并持久化](#image_mogrify_save_as)
35
+
36
+ - [贡献代码](#Contributing)
37
+ - [许可证](#License)
38
+
39
+ <a name="Installation"></a>
40
+
41
+ ## 安装
42
+
43
+ <a name="Usage"></a>
44
+
45
+ 在您 Ruby 应用程序的 `Gemfile` 文件中,添加如下一行代码:
46
+
47
+ gem 'qiniu-rs'
48
+
49
+ 然后,在应用程序所在的目录下,可以运行 `bundle` 安装依赖包:
50
+
51
+ $ bundle
52
+
53
+ 或者,可以使用 Ruby 的包管理器 `gem` 进行安装:
54
+
55
+ $ gem install qiniu-rs
56
+
57
+
58
+ ## 使用
59
+
60
+ <a name="establish_connection!"></a>
61
+
62
+ ### 应用接入
63
+
64
+ 要接入七牛云存储,您需要拥有一对有效的 Access Key 和 Secret Key 用来进行签名认证。可以通过如下步骤获得:
65
+
66
+ 1. [开通七牛开发者帐号](https://dev.qiniutek.com/signup)
67
+ 2. [登录七牛开发者自助平台,查看 Access Key 和 Secret Key](https://dev.qiniutek.com/account/keys) 。
68
+
69
+ 在获取到 Access Key 和 Secret Key 之后,您可以在您的程序中调用如下两行代码进行初始化对接:
70
+
71
+ Qiniu::RS.establish_connection! :access_key => YOUR_APP_ACCESS_KEY,
72
+ :secret_key => YOUR_APP_SECRET_KEY
73
+
74
+ <a name="ror-init"></a>
75
+
76
+ ### Ruby On Rails 应用初始化设置
77
+
78
+ 如果您使用的是 [Ruby on Rails](http://rubyonrails.org/) 框架,我们建议您在应用初始化启动的过程中,依次调用上述两个函数即可,操作如下:
79
+
80
+ 首先,在应用初始化脚本加载的目录中新建一个文件:`YOUR_RAILS_APP/config/initializers/qiniu-rs.rb`
81
+
82
+ 然后,编辑 `YOUR_RAILS_APP/config/initializers/qiniu-rs.rb` 文件内容如下:
83
+
84
+ Qiniu::RS.establish_connection! :access_key => YOUR_APP_ACCESS_KEY,
85
+ :secret_key => YOUR_APP_SECRET_KEY
86
+
87
+ 这样,您就可以在您的 `RAILS_APP` 中使用七牛云存储 Ruby SDK 提供的其他任意方法了。
88
+
89
+ 接下来,我们会逐一介绍此 SDK 提供的其他方法。
90
+
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
+ <a name="upload"></a>
118
+
119
+ ### 上传文件
120
+
121
+ 通过 `Qiniu::RS.put_auth` 函数取得 `remote_upload_url` 之后,即可往该 URL 上传 multipart/form-data 编码格式的数据流。前面讲解了移动 App 拿到 `remote_upload_url` 之后上传数据的流程,如果您的服务端需要上传数据,依然可以使用此 SDK 提供的 `Qiniu::RS.upload` 函数。该函数规格如下:
122
+
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
131
+
132
+ **参数**
133
+
134
+ :url
135
+ : 必须,即通过 `Qiniu::RS.put_auth` 函数取得 `remote_upload_url`
136
+
137
+ :file
138
+ : 必须,字符串类型(String),本地文件可被读取的有效路径
139
+
140
+ :bucket
141
+ : 必须,字符串类型(String),类似传统数据库里边的表名称,我们暂且将其叫做“资源表”,指定将该数据属性信息存储到具体的资源表中 。
142
+
143
+ :key
144
+ : 必须,字符串类型(String),类似传统数据库里边某个表的主键ID,给每一个文件一个UUID用于进行标示。
145
+
146
+ :mime_type
147
+ : 可选,字符串类型(String),文件的 mime-type 值。如若不传入,SDK 会自行计算得出,若计算失败缺省使用 application/octet-stream 代替之。
148
+
149
+ :note
150
+ : 可选,字符串类型(String),备注信息。
151
+
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
+ :enable_crc32_check
156
+ : 可选,Boolean 类型,是否启用文件上传 crc32 校验,默认为 false 。
157
+
158
+ **返回值**
159
+
160
+ 上传成功,返回 `true`,否则返回 `false` 。
161
+
162
+ **针对 NotFound 处理**
163
+
164
+ 您可以上传一个应对 HTTP 404 出错处理的文件,当您 [创建公开外链](#publish) 后,若公开的外链找不到该文件,即可使用您上传的“自定义404文件”代替之。要这么做,您只须使用 `Qiniu::RS.upload` 函数上传一个 `key` 为固定字符串类型的值 `errno-404` 即可。
165
+
166
+ <a name="stat"></a>
167
+
168
+ ### 查看文件属性信息
169
+
170
+ Qiniu::RS.stat(bucket, key)
171
+
172
+ 可以通过 SDK 提供的 `Qiniu::RS.stat` 函数,来查看某个已上传文件的属性信息。
173
+
174
+ **参数**
175
+
176
+ bucket
177
+ : 必须,字符串类型(String),类似传统数据库里边的表名称,我们暂且将其叫做“资源表”,每份数据是属性信息都存储到具体的 bucket(资源表)中 。
178
+
179
+ key
180
+ : 必须,字符串类型(String),类似传统数据库里边某个表的主键ID,每一个文件最终都用一个唯一 `key` 进行标示。
181
+
182
+ **返回值**
183
+
184
+ 如果请求失败,返回 `false`;否则返回如下一个 `Hash` 类型的结构:
185
+
186
+ {
187
+ "fsize" => 3053,
188
+ "hash" => "Fu9lBSwQKbWNlBLActdx8-toAajv",
189
+ "mimeType" => "application/x-ruby",
190
+ "putTime" => 13372775859344500
191
+ }
192
+
193
+ fsize
194
+ : 表示文件总大小,单位是 Byte
195
+
196
+ hash
197
+ : 文件的特征值,可以看做是基版本号
198
+
199
+ mimeType
200
+ : 文件的 mime-type
201
+
202
+ putTime
203
+ : 上传时间,单位是 百纳秒
204
+
205
+ <a name="get"></a>
206
+
207
+ ### 获取文件下载链接(含文件属性信息)
208
+
209
+ Qiniu::RS.get(bucket, key, save_as = nil, expires_in = nil, version = nil)
210
+
211
+ `Qiniu::RS.get` 函数除了能像 `Qiniu::RS.stat` 一样返回文件的属性信息外,还能返回具体的下载链接及其有效时间。
212
+
213
+ **参数**
214
+
215
+ bucket
216
+ : 必须,字符串类型(String),类似传统数据库里边的表名称,我们暂且将其叫做“资源表”,每份数据是属性信息都存储到具体的 bucket(资源表)中 。
217
+
218
+ key
219
+ : 必须,字符串类型(String),类似传统数据库里边某个表的主键ID,每一个文件最终都用一个唯一 `key` 进行标示。
220
+
221
+ save_as
222
+ : 可选,字符串类型(String),文件下载时保存的具体名称
223
+
224
+ expires_in
225
+ : 可选,整型,用于设置下载 URL 的有效期,单位:秒,缺省为 3600 秒
226
+
227
+ version
228
+ : 可选,字符串类型(String),值为 `Qiniu::RS.stat` 或 `Qiniu::RS.get` 函数返回的 `hash` 字段的值,可用于断点续下载。
229
+
230
+ **返回值**
231
+
232
+ 如果请求失败,返回 `false`;否则返回如下一个 `Hash` 类型的结构:
233
+
234
+ {
235
+ "fsize" => 3053,
236
+ "hash" => "Fu9lBSwQKbWNlBLActdx8-toAajv",
237
+ "mimeType" => "application/x-ruby",
238
+ "url" => "http://iovip.qbox.me/file/<an-authorized-token>",
239
+ "expires" => 3600
240
+ }
241
+
242
+ fsize
243
+ : 表示文件总大小,单位是 Byte
244
+
245
+ hash
246
+ : 文件的特征值,可以看做是基版本号
247
+
248
+ mimeType
249
+ : 文件的 mime-type
250
+
251
+ url
252
+ : 文件的临时有效下载链接
253
+
254
+ expires
255
+ : 文件下载链接的有效期,单位为 秒,过了 `expires` 秒之后,下载 `url` 将不再有效
256
+
257
+ <a name="download"></a>
258
+
259
+ ### 只获取文件下载链接
260
+
261
+ Qiniu::RS.download(bucket, key, save_as = nil, expires_in = nil, version = nil)
262
+
263
+ `Qiniu::RS.download` 函数参数与 `Qiniu::RS.get` 一样,差别在于,`Qiniu::RS.download` 只返回文件的下载链接。
264
+
265
+ <a name="delete"></a>
266
+
267
+ ### 删除指定文件
268
+
269
+ Qiniu::RS.delete(bucket, key)
270
+
271
+ `Qiniu::RS.delete` 函数提供了从指定的 `bucket` 中删除指定的 `key`,即删除 `key` 索引关联的具体文件。
272
+
273
+ **参数**
274
+
275
+ bucket
276
+ : 必须,字符串类型(String),类似传统数据库里边的表名称,我们暂且将其叫做“资源表”,每份数据是属性信息都存储到具体的 bucket(资源表)中 。
277
+
278
+ key
279
+ : 必须,字符串类型(String),类似传统数据库里边某个表的主键ID,每一个文件最终都用一个唯一 `key` 进行标示。
280
+
281
+ **返回值**
282
+
283
+ 如果删除成功,返回 `true`,否则返回 `false` 。
284
+
285
+ <a name="drop"></a>
286
+
287
+ ### 删除所有文件(单个“表”)
288
+
289
+ Qiniu::RS.drop(bucket)
290
+
291
+ `Qiniu::RS.drop` 提供了删除整个 `bucket` 及其里边的所有 `key`,以及这些 `key` 关联的所有文件都将被删除。
292
+
293
+ **参数**
294
+
295
+ bucket
296
+ : 必须,字符串类型(String),类似传统数据库里边的表名称,我们暂且将其叫做“资源表”,每份数据是属性信息都存储到具体的 bucket(资源表)中 。
297
+
298
+ **返回值**
299
+
300
+ 如果删除成功,返回 `true`,否则返回 `false` 。
301
+
302
+ <a name="batch"></a>
303
+
304
+ ### 批量操作
305
+
306
+ Qiniu::RS.batch(command, bucket, keys)
307
+
308
+ SDK 还提供了 `Qiniu::RS.batch` 函数来提供批量处理 `Qiniu::RS.stat` 或是 `Qiniu::RS.get` 或 `Qiniu::RS.delete` 的相应功能。
309
+
310
+ **参数**
311
+
312
+ command
313
+ : 必须,字符串类型(String),其值可以是 `stat`, `get`, `delete` 中的一种
314
+
315
+ bucket
316
+ : 必须,字符串类型(String),类似传统数据库里边的表名称,我们暂且将其叫做“资源表”,每份数据是属性信息都存储到具体的 bucket(资源表)中 。
317
+
318
+ keys
319
+ : 必须,数组类型(Array),所要操作 `key` 的集合。
320
+
321
+ **返回值**
322
+
323
+ 如果请求失败,返回 `false`,否则返回一个 `Array` 类型的结构,其中每个元素是一个 `Hash` 类型的结构。例如批量`get`:
324
+
325
+ [
326
+ {
327
+ "code" => 200,
328
+ "data" => {
329
+ "expires" => 3600,
330
+ "fsize" => 3053,
331
+ "hash" => "Fu9lBSwQKbWNlBLActdx8-toAajv",
332
+ "mimeType" => "application/x-ruby",
333
+ "url" => "http://iovip.qbox.me/file/<an-authorized-token>"
334
+ }
335
+ },
336
+ ...
337
+ ]
338
+
339
+ <a name="batch_get"></a>
340
+
341
+ #### 批量获取文件属性信息(含下载链接)
342
+
343
+ Qiniu::RS.batch_get(bucket, keys)
344
+
345
+ `Qiniu::RS.batch_get` 函数是在 `Qiniu::RS.batch` 之上的封装,提供批量获取文件属性信息(含下载链接)的功能。
346
+
347
+ **参数**
348
+
349
+ bucket
350
+ : 必须,字符串类型(String),类似传统数据库里边的表名称,我们暂且将其叫做“资源表”,每份数据是属性信息都存储到具体的 bucket(资源表)中 。
351
+
352
+ keys
353
+ : 必须,数组类型(Array),所要操作 `key` 的集合。
354
+
355
+ **返回值**
356
+
357
+ 如果请求失败,返回 `false`,否则返回一个 `Array` 类型的结构,其中每个元素是一个 `Hash` 类型的结构。`Hash` 类型的值同 `Qiniu::RS.get` 函数的返回值类似,只多出一个 `code` 字段,`code` 为 200 表示所有 keys 全部获取成功,`code` 若为 298 表示部分获取成功。
358
+
359
+ [
360
+ {
361
+ "code" => 200,
362
+ "data" => {
363
+ "expires" => 3600,
364
+ "fsize" => 3053,
365
+ "hash" => "Fu9lBSwQKbWNlBLActdx8-toAajv",
366
+ "mimeType" => "application/x-ruby",
367
+ "url" => "http://iovip.qbox.me/file/<an-authorized-token>"
368
+ }
369
+ },
370
+ ...
371
+ ]
372
+
373
+ <a name="batch_download"></a>
374
+
375
+ #### 批量获取文件下载链接
376
+
377
+ Qiniu::RS.batch_download(bucket, keys)
378
+
379
+ `Qiniu::RS.batch_download` 函数也是在 `Qiniu::RS.batch` 之上的封装,提供批量获取文件下载链接的功能。
380
+
381
+ 参数同 `Qiniu::RS.batch_get` 的参数一样。
382
+
383
+ **返回值**
384
+
385
+ 如果请求失败,返回 `false`,否则返回一个 `Array` 类型的结构,其中每个元素是一个字符串类型的下载链接:
386
+
387
+ ["<download-link-1>", "<download-link-2>", …, "<download-link-N>"]
388
+
389
+ <a name="batch_delete"></a>
390
+
391
+ #### 批量删除文件
392
+
393
+ Qiniu::RS.batch_delete(bucket, keys)
394
+
395
+ `Qiniu::RS.batch_download` 函数也是在 `Qiniu::RS.batch` 之上的封装,提供批量删除文件的功能。
396
+
397
+ 参数同 `Qiniu::RS.batch_get` 的参数一样。
398
+
399
+ **返回值**
400
+
401
+ 如果批量删除成功,返回 `true` ,否则为 `false` 。
402
+
403
+ <a name="publish"></a>
404
+
405
+ ### 创建公开外链
406
+
407
+ Qiniu::RS.publish(domain, bucket)
408
+
409
+ 调用 `Qiniu::RS.publish` 函数可以将您在七牛云存储中的资源表 `bucket` 发布到某个 `domain` 下,`domain` 需要在 DNS 管理里边 CNAME 到 `iovip.qbox.me` 。
410
+
411
+ 这样,用户就可以通过 `http://<domain>/<key>` 来访问资源表 `bucket` 中的文件。键值为 `foo/bar/file` 的文件对应访问 URL 为 `http://<domain>/foo/bar/file`。 另外,`domain` 可以是一个真实的域名,比如 `www.example.com`,也可以是七牛云存储的二级路径,比如 `io.qbox.me/example` 。
412
+
413
+ 例如:执行 `Qiniu::RS.publish("cdn.example.com", "EXAMPLE_BUCKET")` 后,那么键名为 `foo/bar/file` 的文件可以通过 `http://cdn.example.com/foo/bar/file` 访问。
414
+
415
+ **参数**
416
+
417
+ domain
418
+ : 必须,字符串类型(String),资源表发布的目标域名,例如:`cdn.example.com`
419
+
420
+ bucket
421
+ : 必须,字符串类型(String),要公开发布的资源表名称。
422
+
423
+ **返回值**
424
+
425
+ 如果发布成功,返回 `true`,否则返回 `false` 。
426
+
427
+ <a name="unpublish"></a>
428
+
429
+ ### 取消公开外链
430
+
431
+ Qiniu::RS.unpublish(domain)
432
+
433
+ 可以通过 SDK 提供的 `Qiniu::RS.unpublish` 函数来取消指定 `bucket` 的在某个 `domain` 域下的所有公开外链访问。
434
+
435
+ **参数**
436
+
437
+ domain
438
+ : 必须,字符串类型(String),资源表已发布的目标域名名称,例如:`cdn.example.com`
439
+
440
+ **返回值**
441
+
442
+ 如果撤销成功,返回 `true`,否则返回 `false` 。
443
+
444
+ <a name="op-image"></a>
445
+
446
+ ### 图像处理
447
+
448
+ <a name="image_info"></a>
449
+
450
+ #### 查看图片属性信息
451
+
452
+ Qiniu::RS.image_info(url)
453
+
454
+ 使用 SDK 提供的 `Qiniu::RS.image_info` 方法,可以基于一张存储于七牛云存储服务器上的图片,针对其下载链接来获取该张图片的属性信息。
455
+
456
+ **参数**
457
+
458
+ url
459
+ : 必须,字符串类型(String),图片的下载链接,需是 `Qiniu::RS.get`(或`Qiniu::RS.batch_get`)函数返回值中 `url` 字段的值,或者是 `Qiniu::RS.download`(或`Qiniu::RS.batch_download`)函数返回的下载链接。且文件本身必须是图片。
460
+
461
+ **返回值**
462
+
463
+ 如果请求失败,返回 `false`;否则,返回如下一个 `Hash` 类型的结构:
464
+
465
+ {
466
+ "format" => "jpeg",
467
+ "width" => 640,
468
+ "height" => 425,
469
+ "colorModel" => "ycbcr"
470
+ }
471
+
472
+ format
473
+ : 原始图片类型
474
+
475
+ width
476
+ : 原始图片宽度,单位像素
477
+
478
+ height
479
+ : 原始图片高度,单位像素
480
+
481
+ colorModel
482
+ : 原始图片着色模式
483
+
484
+ <a name="image_preview_url"></a>
485
+
486
+ #### 获取指定规格的缩略图预览地址
487
+
488
+ Qiniu::RS.image_preview_url(url, spec)
489
+
490
+ 使用 SDK 提供的 `Qiniu::RS.image_preview_url` 方法,可以基于一张存储于七牛云存储服务器上的图片,针对其下载链接,以及指定的缩略图规格类型,来获取该张图片的缩略图地址。
491
+
492
+ **参数**
493
+
494
+ url
495
+ : 必须,字符串类型(String),图片的下载链接,需是 `Qiniu::RS.get`(或`Qiniu::RS.batch_get`)函数返回值中 `url` 字段的值,或者是 `Qiniu::RS.download`(或`Qiniu::RS.batch_download`)函数返回的下载链接。且文件本身必须是图片。
496
+
497
+ spec
498
+ : 可选,字符串或整型的枚举值,指定缩略图的具体规格,参考 [七牛云存储API之缩略图预览](/v2/api/foimg/#fo-imagePreview) 和 [自定义缩略图规格](/v2/api/foimg/#fo-imagePreviewEx) 。该值缺省为 0 (即输出宽800px高600px图片质量为85的缩略图)
499
+
500
+ **返回值**
501
+
502
+ 返回一个字符串类型的缩略图 URL
503
+
504
+
505
+ <a name="image_mogrify_preview_url"></a>
506
+
507
+ #### 高级图像处理(缩略、裁剪、旋转、转化)
508
+
509
+ `Qiniu::RS.image_mogrify_preview_url()` 方法支持将一个存储在七牛云存储的图片进行缩略、裁剪、旋转和格式转化处理,该方法返回一个可以直接预览缩略图的URL。
510
+
511
+ image_mogrify_preview_url = Qiniu::RS.image_mogrify_preview_url(source_image_url, mogrify_options)
512
+
513
+ **参数**
514
+
515
+ source_image_url
516
+ : 必须,字符串类型(string),指定原始图片的下载链接,可以根据 rs.get() 获取到。
517
+
518
+ mogrify_options
519
+ : 必须,Hash Map 格式的图像处理参数。
520
+
521
+ `mogrify_options` 对象具体的规格如下:
522
+
523
+ mogrify_options = {
524
+ :thumbnail => <ImageSizeGeometry>,
525
+ :gravity => <GravityType>, =NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast
526
+ :crop => <ImageSizeAndOffsetGeometry>,
527
+ :quality => <ImageQuality>,
528
+ :rotate => <RotateDegree>,
529
+ :format => <DestinationImageFormat>, =jpg, gif, png, tif, etc.
530
+ :auto_orient => <TrueOrFalse>
531
+ }
532
+
533
+ `Qiniu::RS.image_mogrify_preview_url()` 方法是对七牛云存储图像处理高级接口的完整包装,关于 `mogrify_options` 参数里边的具体含义和使用方式,可以参考文档:[图像处理高级接口](#/v2/api/foimg/#fo-imageMogr)。
534
+
535
+ **返回值**
536
+
537
+ 返回一个可以预览最终缩略图的URL,String 类型。
538
+
539
+
540
+ <a name="image_mogrify_save_as"></a>
541
+
542
+ #### 高级图像处理(缩略、裁剪、旋转、转化)并持久化存储处理结果
543
+
544
+ `Qiniu::RS.image_mogrify_save_as()` 方法支持将一个存储在七牛云存储的图片进行缩略、裁剪、旋转和格式转化处理,并且将处理后的缩略图作为一个新文件持久化存储到七牛云存储服务器上,这样就可以供后续直接使用而不用每次都传入参数进行图像处理。
545
+
546
+ result = Qiniu::RS.image_mogrify_save_as(target_bucket, target_key, src_img_url, mogrify_options)
547
+
548
+ **参数**
549
+
550
+ target_bucket
551
+ : 必须,字符串类型(string),指定最终缩略图要存放的 bucket 。
552
+
553
+ target_key
554
+ : 必须,字符串类型(string),指定最终缩略图存放在云存储服务端的唯一文件ID。
555
+
556
+ src_img_url
557
+ : 必须,字符串类型(string),指定原始图片的下载链接,可以根据 rs.get() 获取到。
558
+
559
+ mogrify_options
560
+ : 必须,Hash Map 格式的图像处理参数。
561
+
562
+ `mogrify_options` 对象具体的规格如下:
563
+
564
+ mogrify_options = {
565
+ :thumbnail => <ImageSizeGeometry>,
566
+ :gravity => <GravityType>, =NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast
567
+ :crop => <ImageSizeAndOffsetGeometry>,
568
+ :quality => <ImageQuality>,
569
+ :rotate => <RotateDegree>,
570
+ :format => <DestinationImageFormat>, =jpg, gif, png, tif, etc.
571
+ :auto_orient => <TrueOrFalse>
572
+ }
573
+
574
+ `Qiniu::RS::Image.mogrify_preview_url()` 方法是对七牛云存储图像处理高级接口的完整包装,关于 `mogrify_options` 参数里边的具体含义和使用方式,可以参考文档:[图像处理高级接口](#/v2/api/foimg/#fo-imageMogr)。
575
+
576
+ **返回值**
577
+
578
+ 如果请求失败,返回 `false`;否则,返回如下一个 `Hash` 类型的结构:
579
+
580
+ {"hash" => "FrOXNat8VhBVmcMF3uGrILpTu8Cs"}
581
+
582
+ 示例代码:
583
+
584
+ data = Qiniu::RS.get("<test_image_bucket>", "<test_image_key>")
585
+ src_img_url = data["url"]
586
+
587
+ target_bucket = "test_thumbnails_bucket"
588
+ target_key = "cropped-" + @test_image_key
589
+
590
+ mogrify_options = {
591
+ :thumbnail => "!120x120r",
592
+ :gravity => "center",
593
+ :crop => "!120x120a0a0",
594
+ :quality => 85,
595
+ :rotate => 45,
596
+ :format => "jpg",
597
+ :auto_orient => true
598
+ }
599
+
600
+ result = Qiniu::RS.image_mogrify_save_as(target_bucket, target_key, src_img_url, mogrify_options)
601
+ if result
602
+ thumbnail = Qiniu::RS.get(target_bucket, target_key)
603
+ puts thumbnail["url"]
604
+
605
+ # 您可以选择将存放缩略图的 bucket 公开,这样就可以直接以外链的形式访问到缩略图,而不用走API获取下载URL。
606
+ result = Qiniu::RS.publish("pic.example.com", target_bucket)
607
+
608
+ # 然后将 pic.example.com CNAME 到 iovip.qbox.me ,就可以直接以如下方式访问缩略图
609
+ # [GET] http://pic.example.com/<target_key>
610
+ end
611
+
612
+
613
+ <a name="Contributing"></a>
614
+
615
+ ## 贡献代码
616
+
617
+ 七牛云存储 Ruby SDK 源码地址:[https://github.com/qiniu/ruby-sdk](https://github.com/qiniu/ruby-sdk)
618
+
619
+ 1. 登录 [github.com](https://github.com)
620
+ 2. Fork [https://github.com/qiniu/ruby-sdk](https://github.com/qiniu/ruby-sdk)
621
+ 3. 创建您的特性分支 (`git checkout -b my-new-feature`)
622
+ 4. 提交您的改动 (`git commit -am 'Added some feature'`)
623
+ 5. 将您的改动记录提交到远程 `git` 仓库 (`git push origin my-new-feature`)
624
+ 6. 然后到 github 网站的该 `git` 远程仓库的 `my-new-feature` 分支下发起 Pull Request
625
+
626
+ <a name="License"></a>
627
+
628
+ ## 许可证
629
+
630
+ Copyright (c) 2012 qiniutek.com
631
+
632
+ 基于 MIT 协议发布:
633
+
634
+ * [www.opensource.org/licenses/MIT](http://www.opensource.org/licenses/MIT)
data/lib/qiniu/rs.rb CHANGED
@@ -118,6 +118,15 @@ module Qiniu
118
118
  Image.preivew_url(url, spec)
119
119
  end
120
120
 
121
+ def image_mogrify_preview_url(source_image_url, options)
122
+ Image.mogrify_preview_url(source_image_url, options)
123
+ end
124
+
125
+ def image_mogrify_save_as(bucket, key, source_image_url, options)
126
+ code, data = RS.image_mogrify_save_as(bucket, key, source_image_url, options)
127
+ code == StatusOK ? data : false
128
+ end
129
+
121
130
  #def generate_upload_token(scope, expires_in, callback_url = nil, return_url = nil)
122
131
  # Utils.generate_upload_token(scope, expires_in, callback_url, return_url)
123
132
  #end
@@ -14,6 +14,24 @@ module Qiniu
14
14
  url + '/imagePreview/' + spec.to_s
15
15
  end
16
16
 
17
+ def mogrify_preview_url(source_image_url, options)
18
+ source_image_url + '?' + generate_mogrify_params_string(options)
19
+ end
20
+
21
+ def generate_mogrify_params_string(options = {})
22
+ opts = {}
23
+ options.each do |k, v|
24
+ opts[k.to_s] = v
25
+ end
26
+ params_string = ""
27
+ keys = ["thumbnail", "gravity", "crop", "quality", "rotate", "format"]
28
+ keys.each do |key|
29
+ params_string += %Q(/#{key}/#{opts[key]}) unless opts[key].nil?
30
+ end
31
+ params_string += '/auto-orient' unless opts["auto_orient"].nil?
32
+ 'imageMogr' + params_string
33
+ end
34
+
17
35
  end
18
36
  end
19
37
  end
data/lib/qiniu/rs/rs.rb CHANGED
@@ -57,6 +57,18 @@ module Qiniu
57
57
  batch("delete", bucket, keys)
58
58
  end
59
59
 
60
+ def save_as(bucket, key, source_url, op_params_string)
61
+ encoded_uri = encode_entry_uri(bucket, key)
62
+ save_as_string = '/save-as/' + encoded_uri
63
+ new_url = source_url + '?' + op_params_string + save_as_string
64
+ Auth.request new_url
65
+ end
66
+
67
+ def image_mogrify_save_as(bucket, key, source_image_url, options)
68
+ mogrify_params_string = Image.generate_mogrify_params_string(options)
69
+ save_as(bucket, key, source_image_url, mogrify_params_string)
70
+ end
71
+
60
72
  end
61
73
  end
62
74
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Qiniu
4
4
  module RS
5
- VERSION = "2.1.2"
5
+ VERSION = "2.2.1"
6
6
  end
7
7
  end
data/qiniu-rs.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |gem|
7
7
  gem.email = ["why404@gmail.com"]
8
8
  gem.description = %q{Qiniu Resource (Cloud) Storage SDK for Ruby. See: http://docs.qiniutek.com/v2/sdk/ruby/}
9
9
  gem.summary = %q{Qiniu Resource (Cloud) Storage SDK for Ruby}
10
- gem.homepage = "https://github.com/why404/qiniu-rs"
10
+ gem.homepage = "https://github.com/qiniu/ruby-sdk"
11
11
 
12
12
  gem.files = `git ls-files`.split($\)
13
13
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -9,7 +9,7 @@ module Qiniu
9
9
  module RS
10
10
  describe Image do
11
11
 
12
- before :each do
12
+ before :all do
13
13
  =begin
14
14
  code, data = Qiniu::RS::Auth.exchange_by_password!("test@qbox.net", "test")
15
15
  code.should == 200
@@ -20,11 +20,15 @@ module Qiniu
20
20
  puts data.inspect
21
21
  =end
22
22
 
23
- @bucket = "test_images"
23
+ @bucket = "test_images_12345"
24
24
  @key = "image_logo_for_test.png"
25
25
 
26
26
  local_file = File.expand_path('../' + @key, __FILE__)
27
27
 
28
+ result = Qiniu::RS.drop(@bucket)
29
+ result.should_not be_false
30
+ puts result.inspect
31
+
28
32
  put_url = Qiniu::RS.put_auth(10)
29
33
  put_url.should_not be_false
30
34
  put_url.should_not be_empty
@@ -32,21 +36,42 @@ module Qiniu
32
36
  :file => local_file,
33
37
  :bucket => @bucket,
34
38
  :key => @key,
39
+ :mime_type => "image/png",
35
40
  :enable_crc32_check => true
36
41
  result.should be_true
42
+
43
+
44
+ result = Qiniu::RS.get(@bucket, @key)
45
+ result["url"].should_not be_empty
46
+ puts result.inspect
47
+ @source_image_url = result["url"]
48
+
49
+ @mogrify_options = {
50
+ :thumbnail => "!120x120r",
51
+ :gravity => "center",
52
+ :crop => "!120x120a0a0",
53
+ :quality => 85,
54
+ :rotate => 45,
55
+ :format => "jpg",
56
+ :auto_orient => true
57
+ }
37
58
  end
38
59
 
39
60
  context ".info" do
40
61
  it "should works" do
41
- result = Qiniu::RS.get(@bucket, @key)
42
- result["url"].should_not be_empty
43
- puts result.inspect
44
- code, data = Qiniu::RS::Image.info(result["url"])
62
+ code, data = Qiniu::RS::Image.info(@source_image_url)
45
63
  code.should == 200
46
64
  puts data.inspect
47
65
  end
48
66
  end
49
67
 
68
+ context ".mogrify_preview_url" do
69
+ it "should works" do
70
+ mogrify_preview_url = Qiniu::RS::Image.mogrify_preview_url(@source_image_url, @mogrify_options)
71
+ puts mogrify_preview_url.inspect
72
+ end
73
+ end
74
+
50
75
  end
51
76
  end
52
77
  end
@@ -10,6 +10,9 @@ module Qiniu
10
10
  @bucket = 'qiniu_rs_test'
11
11
  @key = Digest::SHA1.hexdigest Time.now.to_s
12
12
  @domain = 'cdn.example.com'
13
+
14
+ @test_image_bucket = 'test_images_12345'
15
+ @test_image_key = 'image_logo_for_test.png'
13
16
  end
14
17
 
15
18
  =begin
@@ -138,7 +141,7 @@ module Qiniu
138
141
 
139
142
  context ".image_info" do
140
143
  it "should works" do
141
- data = Qiniu::RS.get("test_images", "image_logo_for_test.png")
144
+ data = Qiniu::RS.get(@test_image_bucket, @test_image_key)
142
145
  data.should_not be_false
143
146
  data.should_not be_empty
144
147
  puts data.inspect
@@ -149,6 +152,32 @@ module Qiniu
149
152
  end
150
153
  end
151
154
 
155
+ context ".image_mogrify_save_as" do
156
+ it "should works" do
157
+ data = Qiniu::RS.get(@test_image_bucket, @test_image_key)
158
+ data.should_not be_false
159
+ data.should_not be_empty
160
+ puts data.inspect
161
+
162
+ dest_bucket = "test_thumbnails_bucket"
163
+ dest_key = "cropped-" + @test_image_key
164
+ src_img_url = data["url"]
165
+ mogrify_options = {
166
+ :thumbnail => "!120x120r",
167
+ :gravity => "center",
168
+ :crop => "!120x120a0a0",
169
+ :quality => 85,
170
+ :rotate => 45,
171
+ :format => "jpg",
172
+ :auto_orient => true
173
+ }
174
+ result = Qiniu::RS.image_mogrify_save_as(dest_bucket, dest_key, src_img_url, mogrify_options)
175
+ result.should_not be_false
176
+ result.should_not be_empty
177
+ puts result.inspect
178
+ end
179
+ end
180
+
152
181
  context ".generate_upload_token" do
153
182
  it "should works" do
154
183
  data = Qiniu::RS.generate_upload_token({:scope => 'test_bucket', :expires_in => 3600})
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.1.2
4
+ version: 2.2.1
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-03 00:00:00.000000000 Z
12
+ date: 2012-07-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -138,6 +138,7 @@ files:
138
138
  - LICENSE
139
139
  - README.md
140
140
  - Rakefile
141
+ - docs/README.md
141
142
  - lib/qiniu-rs.rb
142
143
  - lib/qiniu/rs.rb
143
144
  - lib/qiniu/rs/auth.rb
@@ -162,7 +163,7 @@ files:
162
163
  - spec/qiniu/rs/version_spec.rb
163
164
  - spec/qiniu/rs_spec.rb
164
165
  - spec/spec_helper.rb
165
- homepage: https://github.com/why404/qiniu-rs
166
+ homepage: https://github.com/qiniu/ruby-sdk
166
167
  licenses: []
167
168
  post_install_message:
168
169
  rdoc_options: []
@@ -176,7 +177,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
176
177
  version: '0'
177
178
  segments:
178
179
  - 0
179
- hash: -2135467260921136706
180
+ hash: -3300065752153229781
180
181
  required_rubygems_version: !ruby/object:Gem::Requirement
181
182
  none: false
182
183
  requirements:
@@ -185,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
186
  version: '0'
186
187
  segments:
187
188
  - 0
188
- hash: -2135467260921136706
189
+ hash: -3300065752153229781
189
190
  requirements: []
190
191
  rubyforge_project:
191
192
  rubygems_version: 1.8.24