Class: Fog::AWS::Storage::File

Inherits:
Model
  • Object
show all
Defined in:
lib/fog/aws/models/storage/file.rb

Defined Under Namespace

Classes: PartList, UploadPartData

Constant Summary collapse

MIN_MULTIPART_CHUNK_SIZE =
Deprecated.
Fog::AWS::Storage::MIN_MULTIPART_CHUNK_SIZE
MAX_SINGLE_PUT_SIZE =
Deprecated.

use MAX_SINGLE_PUT_SIZE instead

Fog::AWS::Storage::MAX_SINGLE_PUT_SIZE
MULTIPART_COPY_THRESHOLD =
Deprecated.

not used for anything

15728640

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#bodyFile

Get file’s body if exists, else ”.

Returns:



110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/fog/aws/models/storage/file.rb', line 110

def body
  return attributes[:body] if attributes.key?(:body)

  file = collection.get(identity)

  attributes[:body] =
    if file
      file.body
    else
      ''
    end
end

#multipart_chunk_sizeObject

Note:

Chunk size to use for multipart uploads. Use small chunk sizes to minimize memory. E.g. 5242880 = 5mb



69
70
71
# File 'lib/fog/aws/models/storage/file.rb', line 69

def multipart_chunk_size
  @multipart_chunk_size
end

Instance Method Details

#aclObject



86
87
88
89
# File 'lib/fog/aws/models/storage/file.rb', line 86

def acl
  requires :directory, :key
  service.get_object_acl(directory.key, key).body['AccessControlList']
end

#acl=(new_acl) ⇒ String

Set file’s access control list (ACL).

valid acls: private, public-read, public-read-write, authenticated-read, bucket-owner-read, bucket-owner-full-control

Parameters:

  • new_acl (String)

    one of valid options

Returns:

  • (String)

    @acl



98
99
100
101
102
103
104
# File 'lib/fog/aws/models/storage/file.rb', line 98

def acl=(new_acl)
  valid_acls = ['private', 'public-read', 'public-read-write', 'authenticated-read', 'bucket-owner-read', 'bucket-owner-full-control']
  unless valid_acls.include?(new_acl)
    raise ArgumentError.new("acl must be one of [#{valid_acls.join(', ')}]")
  end
  @acl = new_acl
end

#concurrencyObject



82
83
84
# File 'lib/fog/aws/models/storage/file.rb', line 82

def concurrency
  @concurrency || 1
end

#concurrency=(concurrency) ⇒ Object

Note:

Number of threads used to copy files.

Raises:

  • (ArgumentError)


76
77
78
79
80
# File 'lib/fog/aws/models/storage/file.rb', line 76

def concurrency=(concurrency)
  raise ArgumentError.new('minimum concurrency is 1') if concurrency.to_i < 1

  @concurrency = concurrency.to_i
end

#copy(target_directory_key, target_file_key, options = {}) ⇒ String

Copy object from one bucket to other bucket.

required attributes: directory, key

Parameters:

  • target_directory_key (String)
  • target_file_key (String)
  • options (Hash) (defaults to: {})

    options for copy_object method

Returns:

  • (String)

    Fog::AWS::Files#head status of directory contents



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/fog/aws/models/storage/file.rb', line 149

def copy(target_directory_key, target_file_key, options = {})
  requires :directory, :key

  self.multipart_chunk_size = service.max_copy_chunk_size if multipart_chunk_size.nil?

  if multipart_chunk_size > 0 && self.content_length.to_i >= multipart_chunk_size
    upload_part_options = options.select { |key, _| ALLOWED_UPLOAD_PART_OPTIONS.include?(key.to_sym) }
    upload_part_options = upload_part_options.merge({ 'x-amz-copy-source' => "#{directory.key}/#{key}" })
    multipart_copy(options, upload_part_options, target_directory_key, target_file_key)
  else
    service.copy_object(directory.key, key, target_directory_key, target_file_key, options)
  end

  target_directory = service.directories.new(:key => target_directory_key)
  target_directory.files.head(target_file_key)
end

#destroy(options = {}) ⇒ Boolean

Destroy file via http DELETE.

required attributes: directory, key

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • versionId (Object)

Returns:

  • (Boolean)

    true if successful



174
175
176
177
178
179
# File 'lib/fog/aws/models/storage/file.rb', line 174

def destroy(options = {})
  requires :directory, :key
  attributes[:body] = nil if options['versionId'] == version
  service.delete_object(directory.key, key, options)
  true
end

#directoryFog::AWS::Storage::Directory

Get the file instance’s directory.



136
137
138
# File 'lib/fog/aws/models/storage/file.rb', line 136

def directory
  @directory
end

#metadataObject



182
183
184
185
# File 'lib/fog/aws/models/storage/file.rb', line 182

def 
  attributes.reject {|key, value| !(key.to_s =~ /^x-amz-/) }
            .reject {|key, value| ['x-amz-id-2', 'x-amz-request-id'].include?(key) }
end

#metadata=(new_metadata) ⇒ Object



188
189
190
# File 'lib/fog/aws/models/storage/file.rb', line 188

def metadata=()
  merge_attributes()
end

#owner=(new_owner) ⇒ Object



193
194
195
196
197
198
199
200
# File 'lib/fog/aws/models/storage/file.rb', line 193

def owner=(new_owner)
  if new_owner
    attributes[:owner] = {
      :display_name => new_owner['DisplayName'] || new_owner[:display_name],
      :id           => new_owner['ID'] || new_owner[:id]
    }
  end
end

#public=(new_public) ⇒ String

Set Access-Control-List permissions.

valid new_publics: public_read, private

Parameters:

  • new_public (String)

Returns:

  • (String)

    new_public



213
214
215
216
217
218
219
220
# File 'lib/fog/aws/models/storage/file.rb', line 213

def public=(new_public)
  if new_public
    @acl = 'public-read'
  else
    @acl = 'private'
  end
  new_public
end

#public?Boolean

Returns:

  • (Boolean)


202
203
204
# File 'lib/fog/aws/models/storage/file.rb', line 202

def public?
  acl.any? {|grant| grant['Grantee']['URI'] == 'http://acs.amazonaws.com/groups/global/AllUsers' && grant['Permission'] == 'READ'}
end

#public_urlString

Get publicly accessible url via http GET. Checks permissions before creating. Defaults to s3 subdomain or compliant bucket name

required attributes: directory, key

Returns:

  • (String)

    public url



230
231
232
233
234
235
236
237
238
239
240
# File 'lib/fog/aws/models/storage/file.rb', line 230

def public_url
  requires :directory, :key
  if public?
    service.request_url(
      :bucket_name => directory.key,
      :object_name => key
    )
  else
    nil
  end
end

#save(options = {}) ⇒ Boolean

Save file with body as contents to directory.key with name key via http PUT

required attributes: body, directory, key

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • acl (String)

    sets x-amz-acl HTTP header. Valid values include, private | public-read | public-read-write | authenticated-read | bucket-owner-read | bucket-owner-full-control

  • cache_control (String)

    sets Cache-Control header. For example, ‘No-cache’

  • content_disposition (String)

    sets Content-Disposition HTTP header. For example, ‘attachment; filename=testing.txt’

  • content_encoding (String)

    sets Content-Encoding HTTP header. For example, ‘x-gzip’

  • content_md5 (String)

    sets Content-MD5. For example, ‘79054025255fb1a26e4bc422aef54eb4’

  • content_type (String)

    Content-Type. For example, ‘text/plain’

  • expires (String)

    sets number of seconds before AWS Object expires.

  • storage_class (String)

    sets x-amz-storage-class HTTP header. Defaults to ‘STANDARD’. Or, ‘REDUCED_REDUNDANCY’

  • encryption (String)

    sets HTTP encryption header. Set to ‘AES256’ to encrypt files at rest on S3

  • tags (String)

    sets x-amz-tagging HTTP header. For example, ‘Org-Id=1’ or ‘Org-Id=1&Service=MyService’

  • website_redirect_location (String)

    sets x-amz-website-redirect-location HTTP header. For example, ‘website_redirect_location=www.rubydoc.info/github/fog/fog-aws

Returns:

  • (Boolean)

    true if no errors



260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
# File 'lib/fog/aws/models/storage/file.rb', line 260

def save(options = {})
  requires :body, :directory, :key
  if options != {}
    Fog::Logger.deprecation("options param is deprecated, use acl= instead [light_black](#{caller.first})[/]")
  end
  options['x-amz-acl'] ||= @acl if @acl
  options['Cache-Control'] = cache_control if cache_control
  options['Content-Disposition'] = content_disposition if content_disposition
  options['Content-Encoding'] = content_encoding if content_encoding
  options['Content-MD5'] = content_md5 if content_md5
  options['Content-Type'] = content_type if content_type
  options['Expires'] = expires if expires
  options.merge!()
  options['x-amz-storage-class'] = storage_class if storage_class
  options['x-amz-tagging'] = tags if tags
  options['x-amz-website-redirect-location'] = website_redirect_location if website_redirect_location
  options.merge!(encryption_headers)

  self.multipart_chunk_size = service.max_put_chunk_size if multipart_chunk_size.nil?
  if multipart_chunk_size > 0 && Fog::Storage.get_body_size(body) >= multipart_chunk_size && body.respond_to?(:read)
    data = multipart_save(options)
    merge_attributes(data.body)
  else
    data = service.put_object(directory.key, key, body, options)
    merge_attributes(data.headers.reject {|key, value| ['Connection', 'Content-Length', 'Content-Type'].include?(key)})
  end
  self.etag = self.etag.gsub('"','') if self.etag
  self.content_length = Fog::Storage.get_body_size(body)
  self.content_type ||= Fog::Storage.get_content_type(body)
  true
end

#url(expires, options = {}) ⇒ String

Get a url for file.

required attributes: key

Parameters:

  • expires (String)

    number of seconds (since 1970-01-01 00:00) before url expires

  • options (Hash) (defaults to: {})

Returns:

  • (String)

    url



300
301
302
303
# File 'lib/fog/aws/models/storage/file.rb', line 300

def url(expires, options = {})
  requires :key
  collection.get_url(key, expires, options)
end

#versionsFog::AWS::Storage::Version

File version if exists or creates new version.



308
309
310
311
312
313
314
315
# File 'lib/fog/aws/models/storage/file.rb', line 308

def versions
  @versions ||= begin
    Fog::AWS::Storage::Versions.new(
      :file         => self,
      :service   => service
    )
  end
end