lib/fog/aliyun/models/storage/files.rb in fog-aliyun-0.3.7 vs lib/fog/aliyun/models/storage/files.rb in fog-aliyun-0.3.8
- old
+ new
@@ -13,13 +13,42 @@
attribute :path
attribute :prefix
model Fog::Storage::Aliyun::File
+ # check_directory_key have two functions:
+ # 1. trim the directory_key suffix '/'
+ # 2. checking whether the directory_key is a bucket.
+ # If so, it will return directly to avoid to create a new redundant folder named with directory_key.
+ # This point will be applied to multi-bucket and make bucket as a directory scenario.
+ def check_directory_key(directory_key)
+ if directory_key != ''
+ # trim the suffix '/'
+ directory_key = directory_key.chomp('/')
+ # The bucket name can not contain '/', so if directory_key, return directory.
+ if directory_key.include? '/'
+ directory_key
+ else
+ data = service.get_bucket(directory_key)
+ puts "[DEBUG] Getting the bucket named with directory name #{directory_key}..."
+ if data.class == Hash && data.key?('Code') && !data['Code'].nil? && !data['Code'].empty?
+ puts "[INFO] The directory name #{directory_key} is not a bucket and will create one folder named with it."
+ directory_key
+ else
+ puts "[INFO] The directory name #{directory_key} is a bucket and store objects directly."
+ ''
+ end
+ end
+ else
+ ''
+ end
+ end
+
def all(_options = {})
requires :directory
- prefix = directory.key + '/' if directory.key != '' && directory.key != '.' && !directory.key.nil?
+ directory_key = check_directory_key(directory.key)
+ prefix = directory_key + '/' if directory_key != '' && directory_key != '.' && !directory_key.nil?
files = service.list_objects(prefix: prefix)['Contents']
return if files.nil?
data = []
i = 0
files.each do |file|
@@ -57,14 +86,15 @@
end
end
def get(key)
requires :directory
- object = if directory.key == ''
+ directory_key = check_directory_key(directory.key)
+ object = if directory_key == ''
key
else
- directory.key + '/' + key
+ directory_key + '/' + key
end
begin
data = service.get_object(object)
rescue StandardError => error
case error.response.body
@@ -125,45 +155,49 @@
new(file_data)
end
def get_url(key)
requires :directory
- object = if directory.key == ''
+ directory_key = check_directory_key(directory.key)
+ object = if directory_key == ''
key
else
- directory.key + '/' + key
+ directory_key + '/' + key
end
service.get_object_http_url_public(object, 3600)
end
def get_http_url(key, expires, options = {})
requires :directory
- object = if directory.key == ''
+ directory_key = check_directory_key(directory.key)
+ object = if directory_key == ''
key
else
- directory.key + '/' + key
+ directory_key + '/' + key
end
expires = expires.nil? ? 0 : expires.to_i
service.get_object_http_url_public(object, expires, options)
end
def get_https_url(key, expires, options = {})
requires :directory
- object = if directory.key == ''
+ directory_key = check_directory_key(directory.key)
+ object = if directory_key == ''
key
else
- directory.key + '/' + key
+ directory_key + '/' + key
end
expires = expires.nil? ? 0 : expires.to_i
service.get_object_https_url_public(object, expires, options)
end
def head(key, _options = {})
requires :directory
- object = if directory.key == ''
+ directory_key = check_directory_key(directory.key)
+ object = if directory_key == ''
key
else
- directory.key + '/' + key
+ directory_key + '/' + key
end
data = service.head_object(object).data
return nil if data[:status] == 404
lastModified = data[:headers]['Last-Modified']
last_modified = (Time.parse(lastModified).localtime if !lastModified.nil? && lastModified != '')