Class: CarrierWave::Nos::NosClient
- Inherits:
-
Object
- Object
- CarrierWave::Nos::NosClient
- Defined in:
- lib/carrierwave/nos/nos_client.rb
Instance Method Summary collapse
- #complete_multi_upload(object_key, upload_id, part_info) ⇒ Object
- #init_multi_upload(object_key) ⇒ Object
-
#initialize(access_key, secrete_key, bucket_name, host = 'nos-eastchina1.126.net') ⇒ NosClient
constructor
A new instance of NosClient.
- #put_file(file, object_key) ⇒ Object
-
#send_request(method, bucket, object_key, data = nil) ⇒ Object
PUT: send_request(‘PUT’, ‘BUCKET_NAME’, ‘conan.jpg’, data) param: data = File.open(FILE_PATH, ‘rb’) GET: send_request(‘GET’, ‘BUCKET_NAME’, ‘conan.jpg’, nil) DELETE: send_request(‘DELETE’, ‘BUCKET_NAME’, ‘conan.jpg’, nil) HEAD: send_request(‘HEAD’, ‘BUCKET_NAME’, ‘conan.jpg’, nil) POST: send_request(‘POST’, ‘BUCKET_NAME’, “#object_key?uploads”, nil) send request and get response.
- #upload_large_file(file, object_key) ⇒ Object
- #upload_part(object_key, part_num, upload_id, data) ⇒ Object
Constructor Details
#initialize(access_key, secrete_key, bucket_name, host = 'nos-eastchina1.126.net') ⇒ NosClient
Returns a new instance of NosClient.
9 10 11 12 13 14 |
# File 'lib/carrierwave/nos/nos_client.rb', line 9 def initialize(access_key, secrete_key, bucket_name, host = 'nos-eastchina1.126.net') @access_key = access_key @secret_key = secrete_key @bucket_name = bucket_name @host = host end |
Instance Method Details
#complete_multi_upload(object_key, upload_id, part_info) ⇒ Object
111 112 113 114 115 116 117 118 |
# File 'lib/carrierwave/nos/nos_client.rb', line 111 def complete_multi_upload(object_key, upload_id, part_info) data = '<CompleteMultipartUpload>' part_info.each do |part_num, etag| data += "<Part><PartNumber>#{part_num}</PartNumber><ETag>#{etag}</ETag></Part>" end data += '</CompleteMultipartUpload>' send_request('POST', @bucket_name, "#{object_key}?uploadId=#{upload_id}", data) end |
#init_multi_upload(object_key) ⇒ Object
91 92 93 94 95 96 97 98 99 100 |
# File 'lib/carrierwave/nos/nos_client.rb', line 91 def init_multi_upload(object_key) resp = send_request('POST', @bucket_name, "#{object_key}?uploads", nil) if resp.code == 200 doc = REXML::Document.new(resp.body) upload_id = REXML::XPath.first(doc, '//UploadId/text()') return upload_id else return false end end |
#put_file(file, object_key) ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/carrierwave/nos/nos_client.rb', line 16 def put_file(file, object_key) if file.class != File raise ArgumentError.new("File object type needed, but got #{file.class}") end resp = if file.size > 100 * 1024 * 1024 upload_large_file(file, object_key) else send_request('PUT', @bucket_name, object_key, file) end resp end |
#send_request(method, bucket, object_key, data = nil) ⇒ Object
PUT: send_request(‘PUT’, ‘BUCKET_NAME’, ‘conan.jpg’, data) param: data = File.open(FILE_PATH, ‘rb’) GET: send_request(‘GET’, ‘BUCKET_NAME’, ‘conan.jpg’, nil) DELETE: send_request(‘DELETE’, ‘BUCKET_NAME’, ‘conan.jpg’, nil) HEAD: send_request(‘HEAD’, ‘BUCKET_NAME’, ‘conan.jpg’, nil) POST: send_request(‘POST’, ‘BUCKET_NAME’, “#object_key?uploads”, nil) send request and get response
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/carrierwave/nos/nos_client.rb', line 36 def send_request(method, bucket, object_key, data = nil) unless %w[GET DELETE HEAD PUT POST].include?(method) raise ArgumentError.new('Only support following http method: GET DELETE HEAD PUT POST') end if data.nil? content_type = '' else mime = MIME::Types.type_for(object_key).first content_type = if mime.nil? 'application/octet-stream' else mime.content_type end end # ruby url encode ignore '/', so replace '/' with '%2f' manually resource = "/#{bucket}/#{URI.encode(object_key).gsub('/', '%2F')}" headers = get_headers(method, resource, content_type, data.nil? ? nil : data.size) url = "#{@bucket_name}.#{@host}" + "/#{URI.encode(object_key).gsub('/', '%2F')}" if method == 'PUT' res = RestClient.put(url, data, headers) elsif method == 'GET' res = RestClient.get(url, headers) elsif method == 'DELETE' res = RestClient.delete(url, headers) elsif method == 'HEAD' res = RestClient.head(url, headers) elsif method == 'POST' res = RestClient.post(url, data, headers) end res end |
#upload_large_file(file, object_key) ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/carrierwave/nos/nos_client.rb', line 70 def upload_large_file(file, object_key) upload_id = init_multi_upload(object_key) if upload_id == false return 400 end part_size = 50 * 1024 * 1024 part_num = 1 part_info = {} until file.eof? part_data = file.read(part_size) etag = upload_part(object_key, part_num, upload_id, part_data) if etag != false part_info[part_num] = etag part_num += 1 else return 400 end end complete_multi_upload(object_key, upload_id, part_info) end |
#upload_part(object_key, part_num, upload_id, data) ⇒ Object
102 103 104 105 106 107 108 109 |
# File 'lib/carrierwave/nos/nos_client.rb', line 102 def upload_part(object_key, part_num, upload_id, data) resp = send_request('PUT', @bucket_name, "#{object_key}?partNumber=#{part_num}&uploadId=#{upload_id}", data) if resp.code == 200 return resp.headers[:etag] else return false end end |