From da3bdd362ee0715f7a88c9ac30d362694f659b2e Mon Sep 17 00:00:00 2001 From: 404 Date: Mon, 30 Jul 2012 15:37:52 +0800 Subject: [PATCH 01/18] added buckets --- lib/qiniu/rs.rb | 10 ++++++++++ lib/qiniu/rs/rs.rb | 8 ++++++++ spec/qiniu/rs/rs_spec.rb | 16 ++++++++++++++-- spec/qiniu/rs_spec.rb | 11 +++++++++++ spec/spec_helper.rb | 8 ++++++++ 5 files changed, 51 insertions(+), 2 deletions(-) diff --git a/lib/qiniu/rs.rb b/lib/qiniu/rs.rb index d02e824..16250a9 100755 --- a/lib/qiniu/rs.rb +++ b/lib/qiniu/rs.rb @@ -29,6 +29,16 @@ module Qiniu code == StatusOK end + def buckets + code, data = RS.buckets + code == StatusOK ? data : false + end + + def mkbucket(bucket_name) + code, data = RS.mkbuckets(bucket_name) + code == StatusOK + end + def put_auth(expires_in = nil, callback_url = nil) code, data = IO.put_auth(expires_in, callback_url) code == StatusOK ? data["url"] : false diff --git a/lib/qiniu/rs/rs.rb b/lib/qiniu/rs/rs.rb index 3d75c3b..3e4903d 100755 --- a/lib/qiniu/rs/rs.rb +++ b/lib/qiniu/rs/rs.rb @@ -6,6 +6,14 @@ module Qiniu class << self include Utils + def buckets + Auth.request Config.settings[:rs_host] + '/buckets' + end + + def mkbucket(bucket_name) + Auth.request Config.settings[:rs_host] + '/mkbucket/' + bucket_name + end + def stat(bucket, key) Auth.request Config.settings[:rs_host] + '/stat/' + encode_entry_uri(bucket, key) end diff --git a/spec/qiniu/rs/rs_spec.rb b/spec/qiniu/rs/rs_spec.rb index 6d2af22..1478828 100755 --- a/spec/qiniu/rs/rs_spec.rb +++ b/spec/qiniu/rs/rs_spec.rb @@ -26,11 +26,15 @@ module Qiniu data2["url"].should_not be_empty data2["expiresIn"].should_not be_zero puts data2.inspect - @put_url = data2["url"] + @bucket = "test" @key = Digest::SHA1.hexdigest (Time.now.to_i+rand(100)).to_s - @domain = 'cdn.example.com' + @domain = 'iovip.qbox.me/test' + + code3, data3 = Qiniu::RS::RS.mkbucket(@bucket) + code3.should == 200 + puts data3.inspect end context "IO.upload_file" do @@ -41,6 +45,14 @@ module Qiniu end end + context ".buckets" do + it "should works" do + code, data = Qiniu::RS::RS.buckets + code.should == 200 + puts data.inspect + end + end + context ".stat" do it "should works" do code, data = Qiniu::RS::RS.stat(@bucket, @key) diff --git a/spec/qiniu/rs_spec.rb b/spec/qiniu/rs_spec.rb index 5af44a4..471c72f 100755 --- a/spec/qiniu/rs_spec.rb +++ b/spec/qiniu/rs_spec.rb @@ -13,6 +13,9 @@ module Qiniu @test_image_bucket = 'test_images_12345' @test_image_key = 'image_logo_for_test.png' + + result = Qiniu::RS.mkbucket(@bucket) + result.should_not be_false end =begin @@ -24,6 +27,14 @@ module Qiniu end =end + context ".buckets" do + it "should works" do + result = Qiniu::RS.buckets + result.should_not be_false + puts result.inspect + end + end + context ".put_auth" do it "should works" do result = Qiniu::RS.put_auth(10) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4161bd4..f4cc93b 100755 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -8,5 +8,13 @@ RSpec.configure do |config| config.before :all do Qiniu::RS.establish_connection! :access_key => "3fPHl_SLkPXdioqI_A8_NGngPWVJhlDk2ktRjogH", :secret_key => "bXTPMDJrVYRJUiSDRFtFYwycVD_mjXxYWrCYlDHy" + +=begin + Qiniu::RS.establish_connection! :access_key => "bE21M6FW9V7zAFrBY5psgKOKJQLiBj12qMWTpc57", + :secret_key => "uMo7Nyq_eDK_CuQ8_FYCxoTHQZqjiaPh-cbiKO7L", + :auth_url => "http://m1.qbox.me:13001/oauth2/token", + :rs_host => "http://m1.qbox.me:13003", + :io_host => "http://m1.qbox.me:13004" +=end end end From 1a9dfeb9a72a47927bbc6e22c13348306f84fecf Mon Sep 17 00:00:00 2001 From: 404 Date: Tue, 31 Jul 2012 10:14:10 +0800 Subject: [PATCH 02/18] uptoken --- lib/qiniu/rs.rb | 16 ++++++++++++---- lib/qiniu/rs/config.rb | 1 + lib/qiniu/rs/io.rb | 8 ++++++++ lib/qiniu/rs/utils.rb | 18 ++---------------- lib/qiniu/rs/version.rb | 2 +- spec/qiniu/rs/io_spec.rb | 10 ++++++++++ spec/qiniu/rs_spec.rb | 16 ++++++++++++++++ spec/spec_helper.rb | 9 ++++----- 8 files changed, 54 insertions(+), 26 deletions(-) diff --git a/lib/qiniu/rs.rb b/lib/qiniu/rs.rb index 16250a9..0538e6b 100755 --- a/lib/qiniu/rs.rb +++ b/lib/qiniu/rs.rb @@ -66,6 +66,18 @@ module Qiniu code == StatusOK end + def upload_with_token opts = {} + code, data = IO.upload_with_token(opts[:uptoken], + opts[:file], + opts[:bucket], + opts[:key], + opts[:mime_type], + opts[:note], + opts[:callback_params], + opts[:enable_crc32_check]) + code == StatusOK ? data : false + end + def stat(bucket, key) code, data = RS.stat(bucket, key) code == StatusOK ? data : false @@ -152,10 +164,6 @@ module Qiniu code == StatusOK ? data : false end - #def generate_upload_token(scope, expires_in, callback_url = nil, return_url = nil) - # Utils.generate_upload_token(scope, expires_in, callback_url, return_url) - #end - def generate_upload_token(opts = {}) token_obj = UploadToken.new(opts) token_obj.access_key = Config.settings[:access_key] diff --git a/lib/qiniu/rs/config.rb b/lib/qiniu/rs/config.rb index 8a03a8e..02855db 100755 --- a/lib/qiniu/rs/config.rb +++ b/lib/qiniu/rs/config.rb @@ -22,6 +22,7 @@ module Qiniu :auth_url => "https://acc.qbox.me/oauth2/token", :rs_host => "http://rs.qbox.me:10100", :io_host => "http://iovip.qbox.me", + :up_host => "http://m1.qbox.me:13019", :client_id => "a75604760c4da4caaa456c0c5895c061c3065c5a", :client_secret => "75df554a39f58accb7eb293b550fa59618674b7d", :access_key => "", diff --git a/lib/qiniu/rs/io.rb b/lib/qiniu/rs/io.rb index 8eb5646..36d05cc 100755 --- a/lib/qiniu/rs/io.rb +++ b/lib/qiniu/rs/io.rb @@ -34,6 +34,14 @@ module Qiniu Auth.request url, ::IO.read(local_file), options end + def upload_with_token(uptoken, local_file, bucket, key = nil, mime_type = nil, custom_meta = nil, callback_params = nil, enable_crc32_check = false) + action_params = _generate_action_params(local_file, bucket, key, mime_type, custom_meta, enable_crc32_check) + callback_params = {:bucket => bucket, :key => key, :mime_type => mime_type} if callback_params.nil? + callback_query_string = Utils.generate_query_string(callback_params) + url = Config.settings[:up_host] + '/upload' + Utils.upload_multipart_data(url, local_file, action_params, callback_query_string, uptoken) + end + private def _generate_action_params(local_file, bucket, key = nil, mime_type = nil, custom_meta = nil, enable_crc32_check = false) raise NoSuchFileError, local_file unless File.exist?(local_file) diff --git a/lib/qiniu/rs/utils.rb b/lib/qiniu/rs/utils.rb index dc7a5e4..27bf9ef 100755 --- a/lib/qiniu/rs/utils.rb +++ b/lib/qiniu/rs/utils.rb @@ -91,13 +91,14 @@ module Qiniu end end - def upload_multipart_data(url, filepath, action_string, callback_query_string = '') + def upload_multipart_data(url, filepath, action_string, callback_query_string = '', uptoken = nil) post_data = { :params => callback_query_string, :action => action_string, :file => File.new(filepath, 'rb'), :multipart => true } + post_data[:auth] = uptoken unless uptoken.nil? http_request url, post_data end @@ -129,21 +130,6 @@ module Qiniu %Q(#{access_key}:#{encoded_digest}) end -=begin - def generate_upload_token(scope, expires_in, callback_url = nil, return_url = nil) - access_key = Config.settings[:access_key] - secret_key = Config.settings[:secret_key] - params = {:scope => scope, :deadline => Time.now.to_i + expires_in} - params[:callbackUrl] = callback_url if !callback_url.nil? && !calback_url.empty? - params[:returnUrl] = return_url if !return_url.nil? && !return_url.empty? - signature = urlsafe_base64_encode(params.to_json) - hmac = HMAC::SHA1.new(secret_key) - hmac.update(signature) - encoded_digest = urlsafe_base64_encode(hmac.digest) - %Q(#{access_key}:#{encoded_digest}:#{signature}) - end -=end - end end end diff --git a/lib/qiniu/rs/version.rb b/lib/qiniu/rs/version.rb index e72d26a..7d50abe 100755 --- a/lib/qiniu/rs/version.rb +++ b/lib/qiniu/rs/version.rb @@ -2,6 +2,6 @@ module Qiniu module RS - VERSION = "2.3.3" + VERSION = "2.4.0" end end diff --git a/spec/qiniu/rs/io_spec.rb b/spec/qiniu/rs/io_spec.rb index fd88969..1c6c02e 100755 --- a/spec/qiniu/rs/io_spec.rb +++ b/spec/qiniu/rs/io_spec.rb @@ -44,6 +44,16 @@ module Qiniu end end + context ".upload_with_token" do + it "should works" do + upopts = {:scope => @bucket, :expires_in => 3600, :callback_url => "http://localhost:4567"} + uptoken = Qiniu::Auth.generate_upload_token(upopts) + code, data = Qiniu::RS::IO.upload_with_token(uptoken, __FILE__, @bucket, @key, nil, nil, nil, true) + code.should == 200 + puts data.inspect + end + end + end end end diff --git a/spec/qiniu/rs_spec.rb b/spec/qiniu/rs_spec.rb index 471c72f..ccfe8f5 100755 --- a/spec/qiniu/rs_spec.rb +++ b/spec/qiniu/rs_spec.rb @@ -71,6 +71,22 @@ module Qiniu end end + context ".upload_with_token" do + it "should works" do + uptoken_opts = {:scope => @bucket, :expires_in => 3600, :callback_url => "http://localhost:4567"} + upload_opts = { + :uptoken => Qiniu::RS.generate_upload_token(uptoken_opts), + :file => __FILE__, + :bucket => @bucket, + :key => @key, + :enable_crc32_check => true + } + result = Qiniu::RS.upload_with_token(upload_opts) + result.should_not be_false + puts result.inspect + end + end + context ".stat" do it "should works" do result = Qiniu::RS.stat(@bucket, @key) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index f4cc93b..d46ba4c 100755 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -6,15 +6,14 @@ require 'rspec' RSpec.configure do |config| config.before :all do - Qiniu::RS.establish_connection! :access_key => "3fPHl_SLkPXdioqI_A8_NGngPWVJhlDk2ktRjogH", - :secret_key => "bXTPMDJrVYRJUiSDRFtFYwycVD_mjXxYWrCYlDHy" +# Qiniu::RS.establish_connection! :access_key => "3fPHl_SLkPXdioqI_A8_NGngPWVJhlDk2ktRjogH", +# :secret_key => "bXTPMDJrVYRJUiSDRFtFYwycVD_mjXxYWrCYlDHy" -=begin Qiniu::RS.establish_connection! :access_key => "bE21M6FW9V7zAFrBY5psgKOKJQLiBj12qMWTpc57", :secret_key => "uMo7Nyq_eDK_CuQ8_FYCxoTHQZqjiaPh-cbiKO7L", :auth_url => "http://m1.qbox.me:13001/oauth2/token", :rs_host => "http://m1.qbox.me:13003", - :io_host => "http://m1.qbox.me:13004" -=end + :io_host => "http://m1.qbox.me:13004", + :up_host => "http://m1.qbox.me:13019" end end From 9210c7fc329a470cda91f34b2e2544b6d6052473 Mon Sep 17 00:00:00 2001 From: 404 Date: Tue, 31 Jul 2012 12:29:22 +0800 Subject: [PATCH 03/18] pub --- lib/qiniu/rs.rb | 25 +++++++++++++++-- lib/qiniu/rs/config.rb | 1 + lib/qiniu/rs/pub.rb | 37 +++++++++++++++++++++++++ spec/qiniu/rs/pub_spec.rb | 57 +++++++++++++++++++++++++++++++++++++++ spec/qiniu/rs_spec.rb | 32 ++++++++++++++++++++++ spec/spec_helper.rb | 3 ++- 6 files changed, 152 insertions(+), 3 deletions(-) create mode 100755 lib/qiniu/rs/pub.rb create mode 100755 spec/qiniu/rs/pub_spec.rb diff --git a/lib/qiniu/rs.rb b/lib/qiniu/rs.rb index 0538e6b..4941a80 100755 --- a/lib/qiniu/rs.rb +++ b/lib/qiniu/rs.rb @@ -11,6 +11,7 @@ module Qiniu autoload :Auth, 'qiniu/rs/auth' autoload :IO, 'qiniu/rs/io' autoload :RS, 'qiniu/rs/rs' + autoload :Pub, 'qiniu/rs/pub' autoload :Image, 'qiniu/rs/image' autoload :AccessToken, 'qiniu/tokens/access_token' autoload :QboxToken, 'qiniu/tokens/qbox_token' @@ -29,13 +30,33 @@ module Qiniu code == StatusOK end + def mkbucket(bucket_name) + code, data = RS.mkbuckets(bucket_name) + code == StatusOK + end + def buckets code, data = RS.buckets code == StatusOK ? data : false end - def mkbucket(bucket_name) - code, data = RS.mkbuckets(bucket_name) + def set_protected(bucket, protected_mode) + code, data = Pub.set_protected(bucket, protected_mode) + code == StatusOK + end + + def set_separator(bucket, separator) + code, data = Pub.set_separator(bucket, separator) + code == StatusOK + end + + def set_style(bucket, name, style) + code, data = Pub.set_style(bucket, name, style) + code == StatusOK + end + + def unstyle(bucket, name) + code, data = Pub.unstyle(bucket, name) code == StatusOK end diff --git a/lib/qiniu/rs/config.rb b/lib/qiniu/rs/config.rb index 02855db..6f6d61c 100755 --- a/lib/qiniu/rs/config.rb +++ b/lib/qiniu/rs/config.rb @@ -23,6 +23,7 @@ module Qiniu :rs_host => "http://rs.qbox.me:10100", :io_host => "http://iovip.qbox.me", :up_host => "http://m1.qbox.me:13019", + :pub_host => "http://m1.qbox.me:13012", :client_id => "a75604760c4da4caaa456c0c5895c061c3065c5a", :client_secret => "75df554a39f58accb7eb293b550fa59618674b7d", :access_key => "", diff --git a/lib/qiniu/rs/pub.rb b/lib/qiniu/rs/pub.rb new file mode 100755 index 0000000..d18d2c2 --- /dev/null +++ b/lib/qiniu/rs/pub.rb @@ -0,0 +1,37 @@ +# -*- encoding: utf-8 -*- + +module Qiniu + module RS + module Pub + class << self + include Utils + + def set_protected(bucket, protected_mode) + host = Config.settings[:pub_host] + Auth.request %Q(#{host}/accessMode/#{bucket}/mode/#{protected_mode}) + end + + def set_separator(bucket, separator) + host = Config.settings[:pub_host] + encoded_separator = encode_entry_uri(separator) + Auth.request %Q(#{host}/separator/#{bucket}/sep/#{encoded_separator}) + end + + def set_style(bucket, name, style) + host = Config.settings[:pub_host] + encoded_name = encode_entry_uri(name) + encoded_style = encode_entry_uri(style) + Auth.request %Q(#{host}/style/#{bucket}/name/#{encoded_name}/style/#{encoded_style}) + end + + def unstyle(bucket, name) + host = Config.settings[:pub_host] + encoded_name = encode_entry_uri(name) + Auth.request %Q(#{host}/unstyle/#{bucket}/name/#{encoded_name}) + end + + end + end + end +end + diff --git a/spec/qiniu/rs/pub_spec.rb b/spec/qiniu/rs/pub_spec.rb new file mode 100755 index 0000000..81b3948 --- /dev/null +++ b/spec/qiniu/rs/pub_spec.rb @@ -0,0 +1,57 @@ +# -*- encoding: utf-8 -*- + +require 'spec_helper' +require 'qiniu/rs/auth' +require 'qiniu/rs/pub' + +module Qiniu + module RS + describe Pub do + + before :all do + @bucket = "test_bucket_123" + + result = Qiniu::RS.mkbucket(@bucket) + result.should_not be_false + end + + after :all do + result = Qiniu::RS.drop(@bucket) + result.should_not be_false + end + + context ".set_protected" do + it "should works" do + code, data = Qiniu::RS::Pub.set_protected(@bucket, 1) + code.should == 200 + puts data.inspect + end + end + + context ".set_separator" do + it "should works" do + code, data = Qiniu::RS::Pub.set_separator(@bucket, "-") + code.should == 200 + puts data.inspect + end + end + + context ".set_style" do + it "should works" do + code, data = Qiniu::RS::Pub.set_style(@bucket, "small.jpg", "imageMogr/auto-orient/thumbnail/!120x120r/gravity/center/crop/!120x120/quality/80") + code.should == 200 + puts data.inspect + end + end + + context ".unstyle" do + it "should works" do + code, data = Qiniu::RS::Pub.unstyle(@bucket, "small.jpg") + code.should == 200 + puts data.inspect + end + end + + end + end +end diff --git a/spec/qiniu/rs_spec.rb b/spec/qiniu/rs_spec.rb index ccfe8f5..a34ffd1 100755 --- a/spec/qiniu/rs_spec.rb +++ b/spec/qiniu/rs_spec.rb @@ -35,6 +35,38 @@ module Qiniu end end + context ".set_protected" do + it "should works" do + result = Qiniu::RS.set_protected(@bucket, 1) + result.should_not be_false + puts result.inspect + end + end + + context ".set_separator" do + it "should works" do + result = Qiniu::RS::Pub.set_separator(@bucket, "-") + result.should_not be_false + puts result.inspect + end + end + + context ".set_style" do + it "should works" do + result = Qiniu::RS::Pub.set_style(@bucket, "small.jpg", "imageMogr/auto-orient/thumbnail/!120x120r/gravity/center/crop/!120x120/quality/80") + result.should_not be_false + puts result.inspect + end + end + + context ".unstyle" do + it "should works" do + result = Qiniu::RS::Pub.unstyle(@bucket, "small.jpg") + result.should_not be_false + puts result.inspect + end + end + context ".put_auth" do it "should works" do result = Qiniu::RS.put_auth(10) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d46ba4c..6fe710b 100755 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -14,6 +14,7 @@ RSpec.configure do |config| :auth_url => "http://m1.qbox.me:13001/oauth2/token", :rs_host => "http://m1.qbox.me:13003", :io_host => "http://m1.qbox.me:13004", - :up_host => "http://m1.qbox.me:13019" + :up_host => "http://m1.qbox.me:13019", + :pub_host => "http://m1.qbox.me:13012" end end From 83475e594ab0a4a641bafcaab655bb2c70eab8a6 Mon Sep 17 00:00:00 2001 From: 404 Date: Tue, 31 Jul 2012 16:26:43 +0800 Subject: [PATCH 04/18] end user module --- lib/qiniu/rs.rb | 11 +++++++++++ lib/qiniu/rs/config.rb | 1 + lib/qiniu/rs/eu.rb | 21 +++++++++++++++++++++ spec/qiniu/rs/eu_spec.rb | 35 +++++++++++++++++++++++++++++++++++ spec/qiniu/rs_spec.rb | 19 +++++++++++++++++++ spec/spec_helper.rb | 3 ++- 6 files changed, 89 insertions(+), 1 deletion(-) create mode 100755 lib/qiniu/rs/eu.rb create mode 100755 spec/qiniu/rs/eu_spec.rb diff --git a/lib/qiniu/rs.rb b/lib/qiniu/rs.rb index 4941a80..c64ee8a 100755 --- a/lib/qiniu/rs.rb +++ b/lib/qiniu/rs.rb @@ -11,6 +11,7 @@ module Qiniu autoload :Auth, 'qiniu/rs/auth' autoload :IO, 'qiniu/rs/io' autoload :RS, 'qiniu/rs/rs' + autoload :EU, 'qiniu/rs/eu' autoload :Pub, 'qiniu/rs/pub' autoload :Image, 'qiniu/rs/image' autoload :AccessToken, 'qiniu/tokens/access_token' @@ -60,6 +61,16 @@ module Qiniu code == StatusOK end + def set_watermark(customer_id, options = {}) + code, data = EU.set_watermark(customer_id, options) + code == StatusOK + end + + def get_watermark(customer_id) + code, data = EU.get_watermark(customer_id) + code == StatusOK ? data : false + end + def put_auth(expires_in = nil, callback_url = nil) code, data = IO.put_auth(expires_in, callback_url) code == StatusOK ? data["url"] : false diff --git a/lib/qiniu/rs/config.rb b/lib/qiniu/rs/config.rb index 6f6d61c..0acaca5 100755 --- a/lib/qiniu/rs/config.rb +++ b/lib/qiniu/rs/config.rb @@ -24,6 +24,7 @@ module Qiniu :io_host => "http://iovip.qbox.me", :up_host => "http://m1.qbox.me:13019", :pub_host => "http://m1.qbox.me:13012", + :eu_host => "http://m1.qbox.me:15000", :client_id => "a75604760c4da4caaa456c0c5895c061c3065c5a", :client_secret => "75df554a39f58accb7eb293b550fa59618674b7d", :access_key => "", diff --git a/lib/qiniu/rs/eu.rb b/lib/qiniu/rs/eu.rb new file mode 100755 index 0000000..76fa14c --- /dev/null +++ b/lib/qiniu/rs/eu.rb @@ -0,0 +1,21 @@ +# -*- encoding: utf-8 -*- + +module Qiniu + module RS + module EU + class << self + include Utils + + def set_watermark(customer_id, options = {}) + Auth.request Config.settings[:pub_host] + '/set', options.merge({:customer => customer_id}) + end + + def get_watermark(customer_id) + Auth.request Config.settings[:pub_host] + '/get', {:customer => customer_id} + end + + end + end + end +end + diff --git a/spec/qiniu/rs/eu_spec.rb b/spec/qiniu/rs/eu_spec.rb new file mode 100755 index 0000000..e4a7322 --- /dev/null +++ b/spec/qiniu/rs/eu_spec.rb @@ -0,0 +1,35 @@ +# -*- encoding: utf-8 -*- + +require 'spec_helper' +require 'qiniu/rs/eu' + +module Qiniu + module RS + describe EU do + + before :all do + @customer_id = "awhy.xu@gmail.com" + end + + context ".set_watermark" do + it "should works" do + options = { + :text => "Powered by QiniuRS" + } + code, data = Qiniu::RS::EU.set_watermark(@customer_id, options) + code.should == 200 + puts data.inspect + end + end + + context ".get_watermark" do + it "should works" do + code, data = Qiniu::RS::EU.get_watermark(@customer_id) + code.should == 200 + puts data.inspect + end + end + + end + end +end diff --git a/spec/qiniu/rs_spec.rb b/spec/qiniu/rs_spec.rb index a34ffd1..578f5da 100755 --- a/spec/qiniu/rs_spec.rb +++ b/spec/qiniu/rs_spec.rb @@ -67,6 +67,25 @@ module Qiniu end end + context ".set_watermark" do + it "should works" do + options = { + :text => "Powered by QiniuRS" + } + result = Qiniu::RS.set_watermark(1, options) + result.should_not be_false + puts result.inspect + end + end + + context ".get_watermark" do + it "should works" do + result = Qiniu::RS.get_watermark(1) + result.should_not be_false + puts result.inspect + end + end + context ".put_auth" do it "should works" do result = Qiniu::RS.put_auth(10) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 6fe710b..98daa2a 100755 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -15,6 +15,7 @@ RSpec.configure do |config| :rs_host => "http://m1.qbox.me:13003", :io_host => "http://m1.qbox.me:13004", :up_host => "http://m1.qbox.me:13019", - :pub_host => "http://m1.qbox.me:13012" + :pub_host => "http://m1.qbox.me:13012", + :eu_host => "http://m1.qbox.me:15000", end end From 1d6397068883323a48eedc4155b8745a48f52004 Mon Sep 17 00:00:00 2001 From: 404 Date: Wed, 1 Aug 2012 11:58:43 +0800 Subject: [PATCH 05/18] rsplus/pub/eu fix --- Gemfile.lock | 2 +- lib/qiniu/rs.rb | 2 +- lib/qiniu/rs/eu.rb | 4 ++-- lib/qiniu/rs/pub.rb | 8 ++++---- lib/qiniu/tokens/upload_token.rb | 2 +- spec/qiniu/rs/io_spec.rb | 2 +- spec/qiniu/rs/pub_spec.rb | 19 ++++++++++++++---- spec/qiniu/rs/rs_spec.rb | 33 ++++++++++++-------------------- 8 files changed, 37 insertions(+), 35 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9c014f2..d948a51 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - qiniu-rs (2.3.3) + qiniu-rs (2.4.0) json (~> 1.7.3) mime-types (~> 1.19) rest-client (~> 1.6.7) diff --git a/lib/qiniu/rs.rb b/lib/qiniu/rs.rb index c64ee8a..c3a35bf 100755 --- a/lib/qiniu/rs.rb +++ b/lib/qiniu/rs.rb @@ -32,7 +32,7 @@ module Qiniu end def mkbucket(bucket_name) - code, data = RS.mkbuckets(bucket_name) + code, data = RS.mkbucket(bucket_name) code == StatusOK end diff --git a/lib/qiniu/rs/eu.rb b/lib/qiniu/rs/eu.rb index 76fa14c..cd6b47b 100755 --- a/lib/qiniu/rs/eu.rb +++ b/lib/qiniu/rs/eu.rb @@ -7,11 +7,11 @@ module Qiniu include Utils def set_watermark(customer_id, options = {}) - Auth.request Config.settings[:pub_host] + '/set', options.merge({:customer => customer_id}) + Auth.request Config.settings[:eu_host] + '/set', options.merge({:customer => customer_id}) end def get_watermark(customer_id) - Auth.request Config.settings[:pub_host] + '/get', {:customer => customer_id} + Auth.request Config.settings[:eu_host] + '/get', {:customer => customer_id} end end diff --git a/lib/qiniu/rs/pub.rb b/lib/qiniu/rs/pub.rb index d18d2c2..faca838 100755 --- a/lib/qiniu/rs/pub.rb +++ b/lib/qiniu/rs/pub.rb @@ -13,20 +13,20 @@ module Qiniu def set_separator(bucket, separator) host = Config.settings[:pub_host] - encoded_separator = encode_entry_uri(separator) + encoded_separator = Utils.urlsafe_base64_encode(separator) Auth.request %Q(#{host}/separator/#{bucket}/sep/#{encoded_separator}) end def set_style(bucket, name, style) host = Config.settings[:pub_host] - encoded_name = encode_entry_uri(name) - encoded_style = encode_entry_uri(style) + encoded_name = Utils.urlsafe_base64_encode(name) + encoded_style = Utils.urlsafe_base64_encode(style) Auth.request %Q(#{host}/style/#{bucket}/name/#{encoded_name}/style/#{encoded_style}) end def unstyle(bucket, name) host = Config.settings[:pub_host] - encoded_name = encode_entry_uri(name) + encoded_name = Utils.urlsafe_base64_encode(name) Auth.request %Q(#{host}/unstyle/#{bucket}/name/#{encoded_name}) end diff --git a/lib/qiniu/tokens/upload_token.rb b/lib/qiniu/tokens/upload_token.rb index 3847607..679cedb 100755 --- a/lib/qiniu/tokens/upload_token.rb +++ b/lib/qiniu/tokens/upload_token.rb @@ -21,7 +21,7 @@ module Qiniu def generate_signature params = {:scope => @scope, :deadline => Time.now.to_i + @expires_in} - params[:callbackUrl] = @callback_url if !@callback_url.nil? && !@calback_url.empty? + params[:callbackUrl] = @callback_url if !@callback_url.nil? && !@callback_url.empty? params[:returnUrl] = @return_url if !@return_url.nil? && !@return_url.empty? urlsafe_base64_encode(params.to_json) end diff --git a/spec/qiniu/rs/io_spec.rb b/spec/qiniu/rs/io_spec.rb index 1c6c02e..c8052e4 100755 --- a/spec/qiniu/rs/io_spec.rb +++ b/spec/qiniu/rs/io_spec.rb @@ -47,7 +47,7 @@ module Qiniu context ".upload_with_token" do it "should works" do upopts = {:scope => @bucket, :expires_in => 3600, :callback_url => "http://localhost:4567"} - uptoken = Qiniu::Auth.generate_upload_token(upopts) + uptoken = Qiniu::RS.generate_upload_token(upopts) code, data = Qiniu::RS::IO.upload_with_token(uptoken, __FILE__, @bucket, @key, nil, nil, nil, true) code.should == 200 puts data.inspect diff --git a/spec/qiniu/rs/pub_spec.rb b/spec/qiniu/rs/pub_spec.rb index 81b3948..70df6b0 100755 --- a/spec/qiniu/rs/pub_spec.rb +++ b/spec/qiniu/rs/pub_spec.rb @@ -2,6 +2,7 @@ require 'spec_helper' require 'qiniu/rs/auth' +require 'qiniu/rs/rs' require 'qiniu/rs/pub' module Qiniu @@ -9,12 +10,22 @@ module Qiniu describe Pub do before :all do - @bucket = "test_bucket_123" - - result = Qiniu::RS.mkbucket(@bucket) - result.should_not be_false + @bucket = "test123" + code, data = Qiniu::RS::RS.mkbucket(@bucket) + code.should == 200 + puts data.inspect end +=begin + context ".mkbucket" do + it "should works" do + code, data = Qiniu::RS::RS.mkbucket(@bucket) + code.should == 200 + puts data.inspect + end + end +=end + after :all do result = Qiniu::RS.drop(@bucket) result.should_not be_false diff --git a/spec/qiniu/rs/rs_spec.rb b/spec/qiniu/rs/rs_spec.rb index 1478828..7deff63 100755 --- a/spec/qiniu/rs/rs_spec.rb +++ b/spec/qiniu/rs/rs_spec.rb @@ -11,37 +11,28 @@ module Qiniu describe RS do before :all do -=begin - code, data = Qiniu::RS::Auth.exchange_by_password!("test@qbox.net", "test") - code.should == 200 - data.should be_an_instance_of(Hash) - data["access_token"].should_not be_empty - data["refresh_token"].should_not be_empty - data["refresh_token"].should_not be_empty - puts data.inspect -=end - code2, data2 = Qiniu::RS::IO.put_auth() - code2.should == 200 - data2["url"].should_not be_empty - data2["expiresIn"].should_not be_zero - puts data2.inspect - @put_url = data2["url"] - - @bucket = "test" + @bucket = "test_bucket_1234" @key = Digest::SHA1.hexdigest (Time.now.to_i+rand(100)).to_s @domain = 'iovip.qbox.me/test' - code3, data3 = Qiniu::RS::RS.mkbucket(@bucket) - code3.should == 200 - puts data3.inspect + code, data = Qiniu::RS::RS.mkbucket(@bucket) + code.should == 200 + puts data.inspect end context "IO.upload_file" do it "should works" do - code, data = Qiniu::RS::IO.upload_file(@put_url, __FILE__, @bucket, @key) + code, data = Qiniu::RS::IO.put_auth() code.should == 200 + data["url"].should_not be_empty + data["expiresIn"].should_not be_zero puts data.inspect + @put_url = data["url"] + + code2, data2 = Qiniu::RS::IO.upload_file(@put_url, __FILE__, @bucket, @key) + code2.should == 200 + puts data2.inspect end end From e7f64fabae5643991232f49d208fbe8f009e5306 Mon Sep 17 00:00:00 2001 From: 404 Date: Wed, 1 Aug 2012 18:04:10 +0800 Subject: [PATCH 06/18] fixed io_spec.rb --- spec/qiniu/rs/io_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/qiniu/rs/io_spec.rb b/spec/qiniu/rs/io_spec.rb index c8052e4..7186f6b 100755 --- a/spec/qiniu/rs/io_spec.rb +++ b/spec/qiniu/rs/io_spec.rb @@ -46,7 +46,7 @@ module Qiniu context ".upload_with_token" do it "should works" do - upopts = {:scope => @bucket, :expires_in => 3600, :callback_url => "http://localhost:4567"} + upopts = {:scope => @bucket, :expires_in => 3600} uptoken = Qiniu::RS.generate_upload_token(upopts) code, data = Qiniu::RS::IO.upload_with_token(uptoken, __FILE__, @bucket, @key, nil, nil, nil, true) code.should == 200 From 33447b0d5fcaa4b6e16203d74ce226bc854b92ca Mon Sep 17 00:00:00 2001 From: 404 Date: Thu, 2 Aug 2012 13:36:46 +0800 Subject: [PATCH 07/18] new uptoken --- lib/qiniu/rs.rb | 3 ++- lib/qiniu/rs/eu.rb | 4 ++-- lib/qiniu/tokens/upload_token.rb | 8 +++++--- spec/qiniu/rs/io_spec.rb | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/qiniu/rs.rb b/lib/qiniu/rs.rb index c3a35bf..1a646ff 100755 --- a/lib/qiniu/rs.rb +++ b/lib/qiniu/rs.rb @@ -203,7 +203,8 @@ module Qiniu #token_obj.scope = opts[:scope] #token_obj.expires_in = opts[:expires_in] #token_obj.callback_url = opts[:callback_url] - #token_obj.return_url = opts[:return_url] + #token_obj.callback_body_type = opts[:callback_body_type] + #token_obj.customer = opts[:customer] token_obj.generate_token end diff --git a/lib/qiniu/rs/eu.rb b/lib/qiniu/rs/eu.rb index cd6b47b..fd437df 100755 --- a/lib/qiniu/rs/eu.rb +++ b/lib/qiniu/rs/eu.rb @@ -7,11 +7,11 @@ module Qiniu include Utils def set_watermark(customer_id, options = {}) - Auth.request Config.settings[:eu_host] + '/set', options.merge({:customer => customer_id}) + Auth.request Config.settings[:eu_host] + '/wmset', options.merge({:customer => customer_id}) end def get_watermark(customer_id) - Auth.request Config.settings[:eu_host] + '/get', {:customer => customer_id} + Auth.request Config.settings[:eu_host] + '/wmget', {:customer => customer_id} end end diff --git a/lib/qiniu/tokens/upload_token.rb b/lib/qiniu/tokens/upload_token.rb index 679cedb..0542762 100755 --- a/lib/qiniu/tokens/upload_token.rb +++ b/lib/qiniu/tokens/upload_token.rb @@ -10,19 +10,21 @@ module Qiniu include Utils - attr_accessor :scope, :expires_in, :callback_url, :return_url + attr_accessor :scope, :expires_in, :callback_url, :callback_body_type, :customer def initialize(opts = {}) @scope = opts[:scope] @expires_in = opts[:expires_in] @callback_url = opts[:callback_url] - @return_url = opts[:return_url] + @callback_body_type = opts[:callback_body_type] + @customer = opts[:customer] end def generate_signature params = {:scope => @scope, :deadline => Time.now.to_i + @expires_in} params[:callbackUrl] = @callback_url if !@callback_url.nil? && !@callback_url.empty? - params[:returnUrl] = @return_url if !@return_url.nil? && !@return_url.empty? + params[:callbackBodyType] = @callback_body_type if !@callback_body_type.nil? && !@callback_body_type.empty? + params[:customer] = @customer if !@customer.nil? && !@customer.empty? urlsafe_base64_encode(params.to_json) end diff --git a/spec/qiniu/rs/io_spec.rb b/spec/qiniu/rs/io_spec.rb index 7186f6b..9d8f558 100755 --- a/spec/qiniu/rs/io_spec.rb +++ b/spec/qiniu/rs/io_spec.rb @@ -46,7 +46,7 @@ module Qiniu context ".upload_with_token" do it "should works" do - upopts = {:scope => @bucket, :expires_in => 3600} + upopts = {:scope => @bucket, :expires_in => 3600, :customer => 1} uptoken = Qiniu::RS.generate_upload_token(upopts) code, data = Qiniu::RS::IO.upload_with_token(uptoken, __FILE__, @bucket, @key, nil, nil, nil, true) code.should == 200 From 8e86a920802939c0d1871dcc7a72e29485bac486 Mon Sep 17 00:00:00 2001 From: 404 Date: Thu, 2 Aug 2012 13:59:02 +0800 Subject: [PATCH 08/18] updated watermark tests --- spec/qiniu/rs/eu_spec.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/spec/qiniu/rs/eu_spec.rb b/spec/qiniu/rs/eu_spec.rb index e4a7322..8c6f03f 100755 --- a/spec/qiniu/rs/eu_spec.rb +++ b/spec/qiniu/rs/eu_spec.rb @@ -1,6 +1,8 @@ # -*- encoding: utf-8 -*- require 'spec_helper' +require 'qiniu/rs/io' +require 'qiniu/rs/pub' require 'qiniu/rs/eu' module Qiniu @@ -9,8 +11,31 @@ module Qiniu before :all do @customer_id = "awhy.xu@gmail.com" + @bucket = "wm_test_bucket" + @key = "image_logo_for_test.png" + + local_file = File.expand_path('../' + @key, __FILE__) + upopts = {:scope => @bucket, :expires_in => 3600, :customer => @customer_id} + uptoken = Qiniu::RS.generate_upload_token(upopts) + + code, data = Qiniu::RS::IO.upload_with_token(uptoken, local_file, @bucket, @key, nil, nil, nil, true) + code.should == 200 + puts data.inspect + + code2, data2 = Qiniu::RS::Pub.set_separator(@bucket, "-") + code2.should == 200 + puts data2.inspect + + code3, data3 = Qiniu::RS::Pub.set_style(@bucket, "small.jpg", "imageView/1/w/120/h/120/q/85/format/jpg/watermark/1") + code3.should == 200 + puts data3.inspect end + #after :all do + # result = Qiniu::RS.drop(@bucket) + # result.should_not be_false + #end + context ".set_watermark" do it "should works" do options = { From 46eb6e3d58365ca1690aed53f11e59a60220a3ef Mon Sep 17 00:00:00 2001 From: 404 Date: Thu, 2 Aug 2012 14:23:43 +0800 Subject: [PATCH 09/18] upload_with_token spec --- spec/qiniu/rs_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/qiniu/rs_spec.rb b/spec/qiniu/rs_spec.rb index 578f5da..45fadaa 100755 --- a/spec/qiniu/rs_spec.rb +++ b/spec/qiniu/rs_spec.rb @@ -124,7 +124,7 @@ module Qiniu context ".upload_with_token" do it "should works" do - uptoken_opts = {:scope => @bucket, :expires_in => 3600, :callback_url => "http://localhost:4567"} + uptoken_opts = {:scope => @bucket, :expires_in => 3600} upload_opts = { :uptoken => Qiniu::RS.generate_upload_token(uptoken_opts), :file => __FILE__, From d1b3f3c0804f2d1d2577f6dece45c746cfef45c4 Mon Sep 17 00:00:00 2001 From: 404 Date: Fri, 3 Aug 2012 09:49:07 +0800 Subject: [PATCH 10/18] fixed io spec --- spec/qiniu/rs/io_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/qiniu/rs/io_spec.rb b/spec/qiniu/rs/io_spec.rb index 9d8f558..ac80a4a 100755 --- a/spec/qiniu/rs/io_spec.rb +++ b/spec/qiniu/rs/io_spec.rb @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# Utils.-*- encoding: utf-8 -*- require 'spec_helper' require 'qiniu/rs/auth' @@ -46,7 +46,7 @@ module Qiniu context ".upload_with_token" do it "should works" do - upopts = {:scope => @bucket, :expires_in => 3600, :customer => 1} + upopts = {:scope => @bucket, :expires_in => 3600, :customer => "awhy.xu@gmail.com"} uptoken = Qiniu::RS.generate_upload_token(upopts) code, data = Qiniu::RS::IO.upload_with_token(uptoken, __FILE__, @bucket, @key, nil, nil, nil, true) code.should == 200 From 1a950e8f8585d2cd3aa3eedf90b375032f9ffa28 Mon Sep 17 00:00:00 2001 From: 404 Date: Fri, 3 Aug 2012 17:08:19 +0800 Subject: [PATCH 11/18] uptoken field rename --- lib/qiniu/tokens/upload_token.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/qiniu/tokens/upload_token.rb b/lib/qiniu/tokens/upload_token.rb index 0542762..6704393 100755 --- a/lib/qiniu/tokens/upload_token.rb +++ b/lib/qiniu/tokens/upload_token.rb @@ -10,20 +10,20 @@ module Qiniu include Utils - attr_accessor :scope, :expires_in, :callback_url, :callback_body_type, :customer + attr_accessor :scope, :expires_in, :callback_url, :callback_body, :customer def initialize(opts = {}) @scope = opts[:scope] @expires_in = opts[:expires_in] @callback_url = opts[:callback_url] - @callback_body_type = opts[:callback_body_type] + @callback_body = opts[:callback_body] @customer = opts[:customer] end def generate_signature params = {:scope => @scope, :deadline => Time.now.to_i + @expires_in} params[:callbackUrl] = @callback_url if !@callback_url.nil? && !@callback_url.empty? - params[:callbackBodyType] = @callback_body_type if !@callback_body_type.nil? && !@callback_body_type.empty? + params[:callbackBodyType] = @callback_body if !@callback_body.nil? && !@callback_body.empty? params[:customer] = @customer if !@customer.nil? && !@customer.empty? urlsafe_base64_encode(params.to_json) end From da0d8d5ef81519099c314b101997f923487f8964 Mon Sep 17 00:00:00 2001 From: 404 Date: Mon, 13 Aug 2012 16:50:40 +0800 Subject: [PATCH 12/18] fixed digest post data --- lib/qiniu/rs/config.rb | 6 +++--- lib/qiniu/rs/utils.rb | 11 ++++++----- lib/qiniu/tokens/qbox_token.rb | 3 ++- spec/qiniu/rs/auth_spec.rb | 4 ++-- spec/spec_helper.rb | 21 +++++++++++++++++---- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/lib/qiniu/rs/config.rb b/lib/qiniu/rs/config.rb index 0acaca5..b667c91 100755 --- a/lib/qiniu/rs/config.rb +++ b/lib/qiniu/rs/config.rb @@ -22,9 +22,9 @@ module Qiniu :auth_url => "https://acc.qbox.me/oauth2/token", :rs_host => "http://rs.qbox.me:10100", :io_host => "http://iovip.qbox.me", - :up_host => "http://m1.qbox.me:13019", - :pub_host => "http://m1.qbox.me:13012", - :eu_host => "http://m1.qbox.me:15000", + :up_host => "http://up.qbox.me", + :pub_host => "http://pu.qbox.me:10200", + :eu_host => "http://eu.qbox.me", :client_id => "a75604760c4da4caaa456c0c5895c061c3065c5a", :client_secret => "75df554a39f58accb7eb293b550fa59618674b7d", :access_key => "", diff --git a/lib/qiniu/rs/utils.rb b/lib/qiniu/rs/utils.rb index 27bf9ef..f12c39c 100755 --- a/lib/qiniu/rs/utils.rb +++ b/lib/qiniu/rs/utils.rb @@ -1,6 +1,7 @@ # -*- encoding: utf-8 -*- require 'uri' +require 'cgi' require 'json' require 'zlib' require 'base64' @@ -104,8 +105,8 @@ module Qiniu def generate_query_string(params) return params if params.is_a?(String) - total_param = params.map { |key, value| key.to_s+"="+value.to_s } - URI.escape(total_param.join("&")) + total_param = params.map { |key, value| %Q(#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s).gsub('+', '%20')}) } + total_param.join("&") end def crc32checksum(filepath) @@ -119,10 +120,10 @@ module Qiniu signature = uri.path query_string = uri.query signature += '?' + query_string if !query_string.nil? && !query_string.empty? - signature += "\n"; + signature += "\n" if params.is_a?(Hash) - total_param = params.map { |key, value| key.to_s+"="+value.to_s } - signature += total_param.join("&") + params_string = generate_query_string(params) + signature += params_string end hmac = HMAC::SHA1.new(secret_key) hmac.update(signature) diff --git a/lib/qiniu/tokens/qbox_token.rb b/lib/qiniu/tokens/qbox_token.rb index 4c9ef4f..90c22bd 100755 --- a/lib/qiniu/tokens/qbox_token.rb +++ b/lib/qiniu/tokens/qbox_token.rb @@ -1,5 +1,6 @@ # -*- encoding: utf-8 -*- +require 'cgi' require 'json' require 'qiniu/tokens/access_token' @@ -21,7 +22,7 @@ module Qiniu signature += '?' + query_string if !query_string.nil? && !query_string.empty? signature += "\n"; if @params.is_a?(Hash) - total_param = @params.map { |key, value| key.to_s+"="+value.to_s } + total_param = @params.map { |key, value| %Q(#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s).gsub('+', '%20')}) } signature += total_param.join("&") end signature diff --git a/spec/qiniu/rs/auth_spec.rb b/spec/qiniu/rs/auth_spec.rb index b4b4efe..e7b9d6a 100755 --- a/spec/qiniu/rs/auth_spec.rb +++ b/spec/qiniu/rs/auth_spec.rb @@ -8,8 +8,8 @@ module Qiniu describe Auth do before :all do - @username = "test@qbox.net" - @password = "test" + @username = "qboxtest" + @password = "qboxtest123" code, data = Qiniu::RS::Auth.exchange_by_password!(@username, @password) code.should == 200 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 98daa2a..5ba1144 100755 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -6,9 +6,11 @@ require 'rspec' RSpec.configure do |config| config.before :all do -# Qiniu::RS.establish_connection! :access_key => "3fPHl_SLkPXdioqI_A8_NGngPWVJhlDk2ktRjogH", -# :secret_key => "bXTPMDJrVYRJUiSDRFtFYwycVD_mjXxYWrCYlDHy" - +=begin + Qiniu::RS.establish_connection! :access_key => "3fPHl_SLkPXdioqI_A8_NGngPWVJhlDk2ktRjogH", + :secret_key => "bXTPMDJrVYRJUiSDRFtFYwycVD_mjXxYWrCYlDHy" +=end +#=begin Qiniu::RS.establish_connection! :access_key => "bE21M6FW9V7zAFrBY5psgKOKJQLiBj12qMWTpc57", :secret_key => "uMo7Nyq_eDK_CuQ8_FYCxoTHQZqjiaPh-cbiKO7L", :auth_url => "http://m1.qbox.me:13001/oauth2/token", @@ -16,6 +18,17 @@ RSpec.configure do |config| :io_host => "http://m1.qbox.me:13004", :up_host => "http://m1.qbox.me:13019", :pub_host => "http://m1.qbox.me:13012", - :eu_host => "http://m1.qbox.me:15000", + :eu_host => "http://m1.qbox.me:13050" +#=end +=begin + Qiniu::RS.establish_connection! :access_key => "k6N9zXGKUs7UFmJtPXLWOF4idSAgPL4xA6BApBd-", + :secret_key => "p77h4hLERjGPi1Aw4P_G5qHGMKcz1MeSz3CqnYMV", + :auth_url => "http://127.0.0.1:9100/oauth2/token", + :rs_host => "http://127.0.0.1:9400", + :io_host => "http://127.0.0.1:9200", + :up_host => "http://127.0.0.1:11200", + :pub_host => "http://127.0.0.1:10200", + :eu_host => "http://127.0.0.1:15000" +=end end end From 6746a8eeebf4291de050c94f75b93fa3ccda5b91 Mon Sep 17 00:00:00 2001 From: 404 Date: Mon, 13 Aug 2012 23:25:39 +0800 Subject: [PATCH 13/18] updated gemlock --- Gemfile.lock | 18 +++++++++--------- lib/qiniu/rs.rb | 2 +- qiniu-rs.gemspec | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index d948a51..abe5a6d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -17,14 +17,14 @@ GEM rake (0.9.2.2) rest-client (1.6.7) mime-types (>= 1.16) - rspec (2.10.0) - rspec-core (~> 2.10.0) - rspec-expectations (~> 2.10.0) - rspec-mocks (~> 2.10.0) - rspec-core (2.10.1) - rspec-expectations (2.10.0) + rspec (2.11.0) + rspec-core (~> 2.11.0) + rspec-expectations (~> 2.11.0) + rspec-mocks (~> 2.11.0) + rspec-core (2.11.1) + rspec-expectations (2.11.2) diff-lcs (~> 1.1.3) - rspec-mocks (2.10.1) + rspec-mocks (2.11.2) ruby-hmac (0.4.0) PLATFORMS @@ -33,5 +33,5 @@ PLATFORMS DEPENDENCIES fakeweb (~> 1.3.0) qiniu-rs! - rake (~> 0.9.2.2) - rspec (~> 2.10.0) + rake (~> 0.9) + rspec (~> 2.11) diff --git a/lib/qiniu/rs.rb b/lib/qiniu/rs.rb index 1a646ff..4b49fae 100755 --- a/lib/qiniu/rs.rb +++ b/lib/qiniu/rs.rb @@ -203,7 +203,7 @@ module Qiniu #token_obj.scope = opts[:scope] #token_obj.expires_in = opts[:expires_in] #token_obj.callback_url = opts[:callback_url] - #token_obj.callback_body_type = opts[:callback_body_type] + #token_obj.callback_body = opts[:callback_body] #token_obj.customer = opts[:customer] token_obj.generate_token end diff --git a/qiniu-rs.gemspec b/qiniu-rs.gemspec index 9ee4290..badc84e 100755 --- a/qiniu-rs.gemspec +++ b/qiniu-rs.gemspec @@ -17,8 +17,8 @@ Gem::Specification.new do |gem| gem.version = Qiniu::RS::VERSION # specify any dependencies here; for example: - gem.add_development_dependency "rake", "~> 0.9.2.2" - gem.add_development_dependency "rspec", "~> 2.10.0" + gem.add_development_dependency "rake", "~> 0.9" + gem.add_development_dependency "rspec", "~> 2.11" gem.add_development_dependency "fakeweb", "~> 1.3.0" gem.add_runtime_dependency "json", "~> 1.7.3" gem.add_runtime_dependency "rest-client", "~> 1.6.7" From 3b58147e70242726e7c3c41c73ace4f4276aa162 Mon Sep 17 00:00:00 2001 From: 404 Date: Mon, 13 Aug 2012 23:42:35 +0800 Subject: [PATCH 14/18] rs spec --- spec/qiniu/rs_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/qiniu/rs_spec.rb b/spec/qiniu/rs_spec.rb index 45fadaa..a0c48fc 100755 --- a/spec/qiniu/rs_spec.rb +++ b/spec/qiniu/rs_spec.rb @@ -45,7 +45,7 @@ module Qiniu context ".set_separator" do it "should works" do - result = Qiniu::RS::Pub.set_separator(@bucket, "-") + result = Qiniu::RS.set_separator(@bucket, "-") result.should_not be_false puts result.inspect end @@ -53,7 +53,7 @@ module Qiniu context ".set_style" do it "should works" do - result = Qiniu::RS::Pub.set_style(@bucket, "small.jpg", "imageMogr/auto-orient/thumbnail/!120x120r/gravity/center/crop/!120x120/quality/80") + result = Qiniu::RS.set_style(@bucket, "small.jpg", "imageMogr/auto-orient/thumbnail/!120x120r/gravity/center/crop/!120x120/quality/80") result.should_not be_false puts result.inspect end @@ -61,7 +61,7 @@ module Qiniu context ".unstyle" do it "should works" do - result = Qiniu::RS::Pub.unstyle(@bucket, "small.jpg") + result = Qiniu::RS.unstyle(@bucket, "small.jpg") result.should_not be_false puts result.inspect end From 556210548b3a088386b30713152c3b59d4d77773 Mon Sep 17 00:00:00 2001 From: 404 Date: Tue, 14 Aug 2012 00:06:42 +0800 Subject: [PATCH 15/18] callback_body_type --- docs/README.md | 11 +++++++++++ lib/qiniu/rs.rb | 2 +- lib/qiniu/tokens/upload_token.rb | 6 +++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8515525..e64e377 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,6 +15,7 @@ title: Ruby SDK 使用指南 | 七牛云存储 - [应用接入](#establish_connection!) - [Ruby On Rails 应用初始化设置](#ror-init) - [上传文件](#upload) + - [获取用于上传文件的临时授权凭证](#generate-upload-token) - [服务端上传流程](#upload-server-side) - [客户端上传流程](#upload-client-side) - [获取用于上传文件的临时授权URL](#put_auth) @@ -95,6 +96,16 @@ title: Ruby SDK 使用指南 | 七牛云存储 ### 上传文件 + + +#### 获取用于上传文件的临时授权凭证 + + Qiniu::RS.generate_upload_token :scope => target_bucket, + :expires_in => expires_in_seconds, + :callback_url => callback_url, + :callback_body_type => callback_body_type, + :customer => customer_uid + #### 服务端上传流程 diff --git a/lib/qiniu/rs.rb b/lib/qiniu/rs.rb index 4b49fae..1a646ff 100755 --- a/lib/qiniu/rs.rb +++ b/lib/qiniu/rs.rb @@ -203,7 +203,7 @@ module Qiniu #token_obj.scope = opts[:scope] #token_obj.expires_in = opts[:expires_in] #token_obj.callback_url = opts[:callback_url] - #token_obj.callback_body = opts[:callback_body] + #token_obj.callback_body_type = opts[:callback_body_type] #token_obj.customer = opts[:customer] token_obj.generate_token end diff --git a/lib/qiniu/tokens/upload_token.rb b/lib/qiniu/tokens/upload_token.rb index 6704393..0542762 100755 --- a/lib/qiniu/tokens/upload_token.rb +++ b/lib/qiniu/tokens/upload_token.rb @@ -10,20 +10,20 @@ module Qiniu include Utils - attr_accessor :scope, :expires_in, :callback_url, :callback_body, :customer + attr_accessor :scope, :expires_in, :callback_url, :callback_body_type, :customer def initialize(opts = {}) @scope = opts[:scope] @expires_in = opts[:expires_in] @callback_url = opts[:callback_url] - @callback_body = opts[:callback_body] + @callback_body_type = opts[:callback_body_type] @customer = opts[:customer] end def generate_signature params = {:scope => @scope, :deadline => Time.now.to_i + @expires_in} params[:callbackUrl] = @callback_url if !@callback_url.nil? && !@callback_url.empty? - params[:callbackBodyType] = @callback_body if !@callback_body.nil? && !@callback_body.empty? + params[:callbackBodyType] = @callback_body_type if !@callback_body_type.nil? && !@callback_body_type.empty? params[:customer] = @customer if !@customer.nil? && !@customer.empty? urlsafe_base64_encode(params.to_json) end From 2bd158c1fef11db9fadc7c4932f34ba1e854d326 Mon Sep 17 00:00:00 2001 From: 404 Date: Tue, 14 Aug 2012 11:16:48 +0800 Subject: [PATCH 16/18] doc --- docs/README.md | 139 +++++++++++++++++++++++++++++++------------------ 1 file changed, 88 insertions(+), 51 deletions(-) diff --git a/docs/README.md b/docs/README.md index e64e377..949582d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -16,26 +16,30 @@ title: Ruby SDK 使用指南 | 七牛云存储 - [Ruby On Rails 应用初始化设置](#ror-init) - [上传文件](#upload) - [获取用于上传文件的临时授权凭证](#generate-upload-token) - - [服务端上传流程](#upload-server-side) - - [客户端上传流程](#upload-client-side) - - [获取用于上传文件的临时授权URL](#put_auth) + - [服务端上传文件](#upload-server-side) + - [客户端直传文件](#upload-client-side) - [查看文件属性信息](#stat) - [获取文件下载链接(含文件属性信息)](#get) - [只获取文件下载链接](#download) - [删除指定文件](#delete) - - [删除所有文件(单个“表”)](#drop) + - [删除所有文件(单个 bucket)](#drop) - [批量操作](#batch) - [批量获取文件属性信息(含下载链接)](#batch_get) - [批量获取文件下载链接](#batch_download) - [批量删除文件](#batch_delete) - [创建公开外链](#publish) - [取消公开外链](#unpublish) + - [bucket 管理](#buckets) + - [创建 bucket](#mkbucket) + - [列出所有 bucket](#list-all-buckets) + - [访问控制](#set-protected) - [图像处理](#op-image) - [查看图片属性信息](#image_info) - [查看图片EXIF信息](#image_exif) - [获取指定规格的缩略图预览地址](#image_preview_url) - [高级图像处理(缩略、裁剪、旋转、转化)](#image_mogrify_preview_url) - [高级图像处理(缩略、裁剪、旋转、转化)并持久化](#image_mogrify_save_as) + - [高级图像处理(水印)](#image-watermarking) - [贡献代码](#Contributing) - [许可证](#License) @@ -100,44 +104,77 @@ title: Ruby SDK 使用指南 | 七牛云存储 #### 获取用于上传文件的临时授权凭证 +要上传一个文件,首先需要调用 SDK 提供的 `Qiniu::RS.generate_upload_token` 函数来获取一个经过授权用于临时匿名上传的 `upload_token`——经过数字签名的一组数据信息,该 `upload_token` 作为文件上传流中 `multipart/form-data` 的一部分进行传输。 + +`Qiniu::RS.generate_upload_token` 函数原型如下: + Qiniu::RS.generate_upload_token :scope => target_bucket, :expires_in => expires_in_seconds, :callback_url => callback_url, :callback_body_type => callback_body_type, - :customer => customer_uid - - - -#### 服务端上传流程 - -通过 `Qiniu::RS.put_file()` 方法可在客户方的业务服务器上直接往七牛云存储上传文件。该函数规格如下: - - Qiniu::RS.put_file :file => file_path, - :key => record_id, - :bucket => bucket_name, - :mime_type => file_mime_type, - :note => some_notes, - :enable_crc32_check => true + :customer => end_user_id **参数** -:file +scope +: 必须,字符串类型(String),设定文件要上传到的目标 `bucket` + +expires_in +: 可选,数字类型,用于设置上传 URL 的有效期,单位:秒,缺省为 3600 秒,即 1 小时后该上传链接不再有效(但该上传URL在其生成之后的59分59秒都是可用的)。 + +callback_url +: 可选,字符串类型(String),用于设置文件上传成功后,七牛云存储服务端要回调客户方的业务服务器地址。 + +callback_body_type +: 可选,字符串类型(String),用于设置文件上传成功后,七牛云存储服务端向客户方的业务服务器发送回调请求的 `Content-Type`。 + +customer +: 可选,字符串类型(String), + +**返回值** + +返回一个字符串类型(String)的用于上传文件用的临时授权 `upload_token`。 + + + +#### 服务端上传文件 + +通过 `Qiniu::RS.upload_with_token()` 方法可在客户方的业务服务器上直接往七牛云存储上传文件。该函数规格如下: + + Qiniu::RS.upload_with_token :uptoken => upload_token, + :file => file_path, + :bucket => bucket_name, + :key => record_id, + :mime_type => file_mime_type, + :note => some_notes, + :callback_params => callback_params, + :enable_crc32_check => false + +**参数** + +uptoken +: 必须,字符串类型(String),调用 `Qiniu::RS.generate_upload_token` 生成的 [用于上传文件的临时授权凭证](#generate-upload-token) + +file : 必须,字符串类型(String),本地文件可被读取的有效路径 -:bucket +bucket : 必须,字符串类型(String),类似传统数据库里边的表名称,我们暂且将其叫做“资源表”,指定将该数据属性信息存储到具体的资源表中 。 -:key +key : 必须,字符串类型(String),类似传统数据库里边某个表的主键ID,给每一个文件一个UUID用于进行标示。 -:mime_type +mime_type : 可选,字符串类型(String),文件的 mime-type 值。如若不传入,SDK 会自行计算得出,若计算失败缺省使用 application/octet-stream 代替之。 -:note -: 可选,字符串类型(String),备注信息。 +note +: 可选,字符串类型(String),为文件添加备注信息。 -:enable_crc32_check -: 可选,Boolean 类型,是否启用文件上传 crc32 校验,默认为 false 。 +callback_params +: 可选,String 或者 Hash 类型,文件上传成功后,七牛云存储向客户方业务服务器发送的回调参数。 + +enable_crc32_check +: 可选,Boolean 类型,是否启用文件上传 crc32 校验,缺省为 false 。 **返回值** @@ -149,33 +186,16 @@ title: Ruby SDK 使用指南 | 七牛云存储 -#### 客户端上传流程 +#### 客户端直传文件 - +客户端上传流程和服务端上传类似,差别在于:客户端直传文件所需的 `upload_token` 可以选择在客户方的业务服务器端生成,也可以选择在客户方的客户端程序里边生成。选择前者,可以和客户方的业务揉合得更紧密和安全些,比如防伪造请求。 -#### 获取用于上传文件的临时授权URL +简单来讲,客户端上传流程也分为两步: - Qiniu::RS.put_auth(expires_in = nil, callback_url = nil) +1. 获取 `upload_token`([用于上传文件的临时授权凭证](#generate-upload-token)) +2. 将该 `upload_token` 作为文件上传流 `multipart/form-data` 中的一部分实现上传操作 -要上传一个文件,首先需要调用 SDK 提供的 `Qiniu::RS.put_auth` 函数来获取一个经过授权用于临时匿名上传的 URL 。 “临时” 一词表示该 URL 有一定的时效性,即过一段时间后会过期,有效期由传入的参数 `expires_in` 决定,缺省情况下 `expires_in` 的值是 3600 秒,即 1 小时后该上传链接不再有效(但该上传URL在其生成之后的59分59秒都是可用的)。 - -**参数** - -expires_in -: 可选,整型,用于设置上传 URL 的有效期,单位:秒,缺省为 3600 秒 - -callback_url -: 可选,字符串类型(String),用于设置文件往这个 URL 上传成功后,七牛云存储服务端要回调客户方的业务服务器地址。 - -**返回值** - -如果请求成功,返回一个字符串类型(String)的用于上传文件的已授权的临时有效 URL ,否则返回 `false` 。 - -**示例** - - remote_upload_url = Qiniu::RS.put_auth(60, 'http://api.example.com/notifications/qiniu-rs') - -如果您的网络程序是从云端(服务端程序)到终端(手持设备应用)的架构模型,且终端用户有使用您移动端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` 这个地址,假设该地址是您业务服务器用于接收处理回调信息的地址。 +如果您的网络程序是从云端(服务端程序)到终端(手持设备应用)的架构模型,且终端用户有使用您移动端App上传文件(比如照片或视频)的需求,可以把您服务器得到的此 `upload_token` 返回给手持设备端的App,然后您的移动 App 可以使用 [七牛云存储 Objective-SDK (iOS)](http://docs.qiniutek.com/v2/sdk/objc/) 或 [七牛云存储 Android-SDK](http://docs.qiniutek.com/v2/sdk/android/) 的相关上传函数或参照 [七牛云存储API之文件上传](http://docs.qiniutek.com/v2/api/io/#upload) 直传文件。这样,您的终端用户即可把数据(比如图片或视频)直接上传到七牛云存储服务器上无须经由您的服务端中转,而且在上传之前,七牛云存储做了智能加速,终端用户上传数据始终是离他物理距离最近的存储节点。当终端用户上传成功后,七牛云存储服务端会向您指定的 `callback_url` 发送回调数据。如果 `callback_url` 所在的服务处理完毕后输出 `JSON` 格式的数据,七牛云存储服务端会将该回调请求所得的响应信息原封不动地返回给终端应用程序。 @@ -299,7 +319,7 @@ key -### 删除所有文件(单个“表”) +### 删除所有文件(单个 bucket) Qiniu::RS.drop(bucket) @@ -423,7 +443,7 @@ keys 调用 `Qiniu::RS.publish` 函数可以将您在七牛云存储中的资源表 `bucket` 发布到某个 `domain` 下,`domain` 需要在 DNS 管理里边 CNAME 到 `iovip.qbox.me` 。 -这样,用户就可以通过 `http:///` 来访问资源表 `bucket` 中的文件。键值为 `foo/bar/file` 的文件对应访问 URL 为 `http:///foo/bar/file`。 另外,`domain` 可以是一个真实的域名,比如 `www.example.com`,也可以是七牛云存储的二级路径,比如 `io.qbox.me/example` 。 +这样,用户就可以通过 `http:///` 来访问资源表 `bucket` 中的文件。键值为 `foo/bar/file` 的文件对应访问 URL 为 `http:///foo/bar/file`。 另外,`domain` 可以是一个真实的域名,比如 `www.example.com`,也可以是七牛云存储的二级路径,比如 `iovip.qbox.me/example` 。 例如:执行 `Qiniu::RS.publish("cdn.example.com", "EXAMPLE_BUCKET")` 后,那么键名为 `foo/bar/file` 的文件可以通过 `http://cdn.example.com/foo/bar/file` 访问。 @@ -456,6 +476,23 @@ domain 如果撤销成功,返回 `true`,否则返回 `false` 。 + + +### bucket 管理 + + + +#### 创建 bucket + + + +#### 列出所有 bucket + + + +#### 访问控制 + + ### 图像处理 From fcc6870f2e655989084d0b5cbb96871275bc9f66 Mon Sep 17 00:00:00 2001 From: 404 Date: Tue, 14 Aug 2012 17:58:34 +0800 Subject: [PATCH 17/18] updated doc --- Gemfile.lock | 2 +- docs/README.md | 339 ++++++++++++++++++++++++++++++++++++---- lib/qiniu/rs.rb | 4 +- lib/qiniu/rs/eu.rb | 5 +- lib/qiniu/rs/version.rb | 2 +- spec/qiniu/rs_spec.rb | 4 +- spec/spec_helper.rb | 8 +- 7 files changed, 319 insertions(+), 45 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index abe5a6d..a15524f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - qiniu-rs (2.4.0) + qiniu-rs (3.0.0) json (~> 1.7.3) mime-types (~> 1.19) rest-client (~> 1.6.7) diff --git a/docs/README.md b/docs/README.md index 949582d..9c49629 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,6 +17,7 @@ title: Ruby SDK 使用指南 | 七牛云存储 - [上传文件](#upload) - [获取用于上传文件的临时授权凭证](#generate-upload-token) - [服务端上传文件](#upload-server-side) + - [针对 NotFound 场景处理](#upload-file-for-not-found) - [客户端直传文件](#upload-client-side) - [查看文件属性信息](#stat) - [获取文件下载链接(含文件属性信息)](#get) @@ -29,9 +30,9 @@ title: Ruby SDK 使用指南 | 七牛云存储 - [批量删除文件](#batch_delete) - [创建公开外链](#publish) - [取消公开外链](#unpublish) - - [bucket 管理](#buckets) - - [创建 bucket](#mkbucket) - - [列出所有 bucket](#list-all-buckets) + - [Bucket(资源表)管理](#buckets) + - [创建 Bucket](#mkbucket) + - [列出所有 Bucket](#list-all-buckets) - [访问控制](#set-protected) - [图像处理](#op-image) - [查看图片属性信息](#image_info) @@ -40,6 +41,12 @@ title: Ruby SDK 使用指南 | 七牛云存储 - [高级图像处理(缩略、裁剪、旋转、转化)](#image_mogrify_preview_url) - [高级图像处理(缩略、裁剪、旋转、转化)并持久化](#image_mogrify_save_as) - [高级图像处理(水印)](#image-watermarking) + - [水印准备工作](#watermarking-pre-work) + - [设置原图保护](#watermarking-set-protected) + - [设置水印预览图URL分隔符](#watermarking-set-sep) + - [设置水印预览图规格别名](#watermarking-set-style) + - [设置水印模板](#watermarking-set-template) + - [获取水印模板](#watermarking-get-template) - [贡献代码](#Contributing) - [许可证](#License) @@ -116,20 +123,20 @@ title: Ruby SDK 使用指南 | 七牛云存储 **参数** -scope +:scope : 必须,字符串类型(String),设定文件要上传到的目标 `bucket` -expires_in +:expires_in : 可选,数字类型,用于设置上传 URL 的有效期,单位:秒,缺省为 3600 秒,即 1 小时后该上传链接不再有效(但该上传URL在其生成之后的59分59秒都是可用的)。 -callback_url +:callback_url : 可选,字符串类型(String),用于设置文件上传成功后,七牛云存储服务端要回调客户方的业务服务器地址。 -callback_body_type +:callback_body_type : 可选,字符串类型(String),用于设置文件上传成功后,七牛云存储服务端向客户方的业务服务器发送回调请求的 `Content-Type`。 -customer -: 可选,字符串类型(String), +:customer +: 可选,字符串类型(String),客户方终端用户(End User)的ID,该字段可以用来标示一个文件的属主,这在一些特殊场景下(比如给终端用户上传的图片打上名字水印)非常有用。 **返回值** @@ -139,50 +146,62 @@ customer #### 服务端上传文件 -通过 `Qiniu::RS.upload_with_token()` 方法可在客户方的业务服务器上直接往七牛云存储上传文件。该函数规格如下: +通过 `Qiniu::RS.upload_file()` 方法可在客户方的业务服务器上直接往七牛云存储上传文件。该函数规格如下: - Qiniu::RS.upload_with_token :uptoken => upload_token, - :file => file_path, - :bucket => bucket_name, - :key => record_id, - :mime_type => file_mime_type, - :note => some_notes, - :callback_params => callback_params, - :enable_crc32_check => false + Qiniu::RS.upload_file :uptoken => upload_token, + :file => file_path, + :bucket => bucket_name, + :key => record_id, + :mime_type => file_mime_type, + :note => some_notes, + :callback_params => callback_params, + :enable_crc32_check => false **参数** -uptoken +:uptoken : 必须,字符串类型(String),调用 `Qiniu::RS.generate_upload_token` 生成的 [用于上传文件的临时授权凭证](#generate-upload-token) -file +:file : 必须,字符串类型(String),本地文件可被读取的有效路径 -bucket +:bucket : 必须,字符串类型(String),类似传统数据库里边的表名称,我们暂且将其叫做“资源表”,指定将该数据属性信息存储到具体的资源表中 。 -key +:key : 必须,字符串类型(String),类似传统数据库里边某个表的主键ID,给每一个文件一个UUID用于进行标示。 -mime_type +:mime_type : 可选,字符串类型(String),文件的 mime-type 值。如若不传入,SDK 会自行计算得出,若计算失败缺省使用 application/octet-stream 代替之。 -note +:note : 可选,字符串类型(String),为文件添加备注信息。 -callback_params +:callback_params : 可选,String 或者 Hash 类型,文件上传成功后,七牛云存储向客户方业务服务器发送的回调参数。 -enable_crc32_check +:enable_crc32_check : 可选,Boolean 类型,是否启用文件上传 crc32 校验,缺省为 false 。 **返回值** -上传成功,返回 `true`,否则返回 `false` 。 +上传成功,返回如下一个 Hash,否则返回 `false`: -**针对 NotFound 处理** + {"hash"=>"FgHk-_iqpnZji6PsNr4ghsK5qEwR"} -您可以上传一个应对 HTTP 404 出错处理的文件,当您 [创建公开外链](#publish) 后,若公开的外链找不到该文件,即可使用您上传的“自定义404文件”代替之。要这么做,您只须使用 `Qiniu::RS.put_file` 函数上传一个 `key` 为固定字符串类型的值 `errno-404` 即可。 + + +##### 针对 NotFound 场景处理 + +您可以上传一个应对 HTTP 404 出错处理的文件,当您 [创建公开外链](#publish) 后,若公开的外链找不到该文件,即可使用您上传的“自定义404文件”代替之。要这么做,您只须使用 `Qiniu::RS.upload_file` 函数上传一个 `key` 为固定字符串类型的值 `errno-404` 即可。 + +除了使用 SDK 提供的方法,同样也可以借助七牛云存储提供的命令行辅助工具 [qboxrsctl](https://github.com/qiniu/devtools/tags) 达到同样的目的: + + qboxrsctl put + +将其中的 `` 换作 `errno-404` 即可。 + +注意,每个 `` 里边有且只有一个 `errno-404` 文件,上传多个,最后的那一个会覆盖前面所有的。 @@ -478,20 +497,61 @@ domain -### bucket 管理 +### Bucket(资源表)管理 -#### 创建 bucket +#### 创建 Bucket + + Qiniu::RS.mkbucket(bucket_name) + +可以通过 SDK 提供的 `Qiniu::RS.mkbucket` 函数创建一个 bucket(资源表)。 + +**参数** + +bucket_name +: 必须,字符串类型(String),资源表 bucket 的名称。 + +**返回值** + +如果指定 bucket 创建成功,返回 `true`,否则返回 `false` 。 -#### 列出所有 bucket +#### 列出所有 Bucket + + Qiniu::RS.buckets + +可以通过 SDK 提供的 `Qiniu::RS.buckets` 函数列出当前登录客户的所有 buckets(资源表)。 + +**返回值** + +如果请求成功,返回一个 buckets 的列表(Array),否则返回 `false` 。 + + ["Bucket1", "Bucket2", …, "BucketN"] #### 访问控制 - + + Qiniu::RS.set_protected(bucket_name, protected_mode) + +可以通过 SDK 提供的 `Qiniu::RS.set_protected` 函数来设置指定 bucket 的访问属性,一般在水印处理时作原图保护用。 + +**参数** + +bucket_name +: 必须,字符串类型(String),指定资源表 bucket 的名称。 + +protected_mode +: 必须,整型,值为 1 或者 0,值为 1 表示启用保护模式,反之亦然。 + +该函数不常用,一般在特殊场景下会用到。比如给图片打水印时,首先要设置原图保护,禁用公开的图像处理操作,采用水印的特殊图像处理,而保护原图就可以通过该函数操作实现。 + +**返回值** + +如果设置成功,返回 `true`,否则返回 `false` 。 + @@ -681,6 +741,219 @@ mogrify_options end + + +## 高级图像处理(水印) + + + +### 水印准备工作 + +为了保护用户原图和方便用户访问打过水印之后的图片,在经水印作用之前,需进行以下一些设置: + +1. [设置原图保护](#watermarking-set-protected) +2. [设置水印预览图URL分隔符](#watermarking-set-sep) +3. [设置水印预览图规格别名](#watermarking-set-style) + + + +#### 1. 设置原图保护 + +用户的图片打上水印后,其原图不可见。通过给原图所在的 Bucket(资源表)设置访问控制,可以达到保护原图的目的,详情请参考 [Bucket(资源表)管理之访问控制](set-protected)。 + +设置原图保护也可以借助七牛云存储提供的命令行辅助工具 [qboxrsctl](https://github.com/qiniu/devtools/tags) 来实现: + + // 为下面的所有图片设置原图保护 + qboxrsctl protected + + + +#### 2. 设置水印预览图URL分隔符 + +没有设置水印前,用户可以通过如下公开链接的形式访问原图([创建公开外链后的情况下](/v3/api/io/#rs-Publish)): + + http:/// + +设置水印后,其原图属性为私有,不能再通过这种形式访问。但是用户可以在原图的 `` 后面加上“分隔符”,以及相应的水印风格样式来访问打水印后的图片。例如,假设您为用户设定的访问水印图的分隔符为中划线 “-”,那么用户可以通过这种形式来访问打水印后的图片: + + http:///-/imageView//w//h//q//format//sharpen//watermark/ + +其中,`HasWatermark` 参数为 `0` (或者没有)表示不打水印,为 `1` 表示给图片打水印。 + +通过 SDK 提供的 `Qiniu::RS.set_separator` 函数可以设置水印预览图URL分隔符: + + Qiniu::RS.set_separator(bucket_name, separator) + +**参数** + +bucket_name +: 必须,字符串类型(String),图片所在的 Bucket(资源表) 名称 + +separator +: 必须,字符串类型(String),源图片与预览图规格之间的分割符 + +**返回值** + +操作成功返回 `true`,否则返回 `false`。 + +除了使用 SDK 提供的方法,同样可以借助七牛云存储提供的命令行辅助工具 [qboxrsctl](https://github.com/qiniu/devtools/tags) 达到同样的目的: + + // 设置预览图分隔符 + qboxrsctl separator + + + +#### 3. 设置水印预览图规格别名 + +通过步骤2中所描述的水印预览图 URL 来访问打水印后的图片毕竟较为繁琐,因此可以通过为该水印预览图规格设置“别名”的形式来访问。如: + +别名(Name) | 规格(Style) | 说明 +----------- | ------------ | ------- +small.jpg | imageView/0/w/120/h/90 | 大小为 120x90,不打水印 +middle.jpg | imageView/0/w/440/h/330/watermark/1 | 大小为 440x330,打水印 +large.jpg | imageView/0/w/1280/h/760/watermark/1 | 大小为 1280x760,打水印 + + +SDK 提供了 `Qiniu::RS.set_style` 函数可以定义预览图规格别名,该函数原型如下: + + Qiniu::RS.set_style(bucket, name, style) + +**参数** + +bucket +: 必须,字符串类型(String),图片所在的 Bucket(资源表) 名称 + +name +: 必须,字符串类型(String),预览图规格名称(别名) + +style +: 必须,字符串类型(String),具体的规格样式 + +**返回值** + +操作成功返回 `true`,否则返回 `false` 。 + +除了使用 SDK 提供的方法,同样也可以借助七牛云存储提供的命令行辅助工具 [qboxrsctl](https://github.com/qiniu/devtools/tags) 达到同样的目的: + + // 为 下面的所有图片设置名为