Class: CarrierWave::Storage::Fog::File

Inherits:
Object
  • Object
show all
Includes:
Utilities::Uri
Defined in:
lib/carrierwave/storage/fog.rb

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (File) initialize(uploader, base, path)



269
270
271
# File 'lib/carrierwave/storage/fog.rb', line 269

def initialize(uploader, base, path)
  @uploader, @base, @path = uploader, base, path
end

Instance Attribute Details

- (Object) path (readonly)

Current local path to file

Returns

String

a path to file



168
169
170
# File 'lib/carrierwave/storage/fog.rb', line 168

def path
  @path
end

Instance Method Details

- (Object) attributes

Return all attributes from file

Returns

Hash

attributes from file



177
178
179
# File 'lib/carrierwave/storage/fog.rb', line 177

def attributes
  file.attributes
end

- (Object) authenticated_url(options = {})

Return a temporary authenticated url to a private file, if available Only supported for AWS, Rackspace and Google providers

Returns

String

temporary authenticated url

or
NilClass

no authenticated url available



191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/carrierwave/storage/fog.rb', line 191

def authenticated_url(options = {})
  if ['AWS', 'Google', 'Rackspace', 'OpenStack'].include?(@uploader.fog_credentials[:provider])
    # avoid a get by using local references
    local_directory = connection.directories.new(:key => @uploader.fog_directory)
    local_file = local_directory.files.new(:key => path)
    if @uploader.fog_credentials[:provider] == "AWS"
      local_file.url(::Fog::Time.now + @uploader.fog_authenticated_url_expiration, options)
    elsif ['Rackspace', 'OpenStack'].include?(@uploader.fog_credentials[:provider])
      connection.get_object_https_url(@uploader.fog_directory, path, ::Fog::Time.now + @uploader.fog_authenticated_url_expiration)
    else
      local_file.url(::Fog::Time.now + @uploader.fog_authenticated_url_expiration)
    end
  else
    nil
  end
end

- (Object) content_type

Lookup value for file content-type header

Returns

String

value of content-type



215
216
217
# File 'lib/carrierwave/storage/fog.rb', line 215

def content_type
  @content_type || file.content_type
end

- (Object) content_type=(new_content_type)

Set non-default content-type header (default is file.content_type)

Returns

String

returns new content type value



226
227
228
# File 'lib/carrierwave/storage/fog.rb', line 226

def content_type=(new_content_type)
  @content_type = new_content_type
end

- (CarrierWave::Storage::Fog::File) copy_to(new_path)

Creates a copy of this file and returns it.

Parameters

new_path (String)

The path where the file should be copied to.

Returns



413
414
415
416
# File 'lib/carrierwave/storage/fog.rb', line 413

def copy_to(new_path)
  connection.copy_object(@uploader.fog_directory, file.key, @uploader.fog_directory, new_path, acl_header)
  CarrierWave::Storage::Fog::File.new(@uploader, @base, new_path)
end

- (Object) delete

Remove the file from service

Returns

Boolean

true for success or raises error



237
238
239
240
# File 'lib/carrierwave/storage/fog.rb', line 237

def delete
  # avoid a get by just using local reference
  directory.files.new(:key => path).destroy
end

- (Boolean) exists?

Check if the file exists on the remote service

Returns

Boolean

true if file exists or false



300
301
302
# File 'lib/carrierwave/storage/fog.rb', line 300

def exists?
  !!directory.files.head(path)
end

- (Object) extension

Return extension of file

Returns

String

extension of file or nil if the file has no extension



249
250
251
252
# File 'lib/carrierwave/storage/fog.rb', line 249

def extension
  path_elements = path.split('.')
  path_elements.last if path_elements.size > 1
end

- (Object) filename(options = {})

Return file name, if available

Returns

String

file name

or
NilClass

no file name available



396
397
398
399
400
# File 'lib/carrierwave/storage/fog.rb', line 396

def filename(options = {})
  if file_url = url(options)
    URI.decode(file_url.split('?').first).gsub(/.*\/(.*?$)/, '\1')
  end
end

- (Object) headers

deprecated: All attributes from file (includes headers)

Returns

Hash

attributes from file



261
262
263
264
265
266
267
# File 'lib/carrierwave/storage/fog.rb', line 261

def headers
  location = caller.first
  warning = "[yellow][WARN] headers is deprecated, use attributes instead[/]"
  warning << " [light_black](#{location})[/]"
  Formatador.display_line(warning)
  attributes
end

- (Object) public_url

Return a url to a public file, if available

Returns

String

public url

or
NilClass

no public url available



336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
# File 'lib/carrierwave/storage/fog.rb', line 336

def public_url
  encoded_path = encode_path(path)
  if host = @uploader.asset_host
    if host.respond_to? :call
      "#{host.call(self)}/#{encoded_path}"
    else
      "#{host}/#{encoded_path}"
    end
  else
    # AWS/Google optimized for speed over correctness
    case @uploader.fog_credentials[:provider]
    when 'AWS'
      # check if some endpoint is set in fog_credentials
      if @uploader.fog_credentials.has_key?(:endpoint)
        "#{@uploader.fog_credentials[:endpoint]}/#{@uploader.fog_directory}/#{encoded_path}"
      else
        protocol = @uploader.fog_use_ssl_for_aws ? "https" : "http"
        # if directory is a valid subdomain, use that style for access
        if @uploader.fog_directory.to_s =~ /^(?:[a-z]|\d(?!\d{0,2}(?:\d{1,3}){3}$))(?:[a-z0-9\.]|(?![\-])|\-(?![\.])){1,61}[a-z0-9]$/
          "#{protocol}://#{@uploader.fog_directory}.s3.amazonaws.com/#{encoded_path}"
        else
          # directory is not a valid subdomain, so use path style for access
          "#{protocol}://s3.amazonaws.com/#{@uploader.fog_directory}/#{encoded_path}"
        end
      end
    when 'Google'
      "https://commondatastorage.googleapis.com/#{@uploader.fog_directory}/#{encoded_path}"
    else
      # avoid a get by just using local reference
      directory.files.new(:key => path).public_url
    end
  end
end

- (Object) read

Read content of file from service

Returns

String

contents of file



279
280
281
# File 'lib/carrierwave/storage/fog.rb', line 279

def read
  file.body
end

- (Object) size

Return size of file body

Returns

Integer

size of file body



290
291
292
# File 'lib/carrierwave/storage/fog.rb', line 290

def size
  file.content_length
end

- (Object) store(new_file)

Write file to service

Returns

Boolean

true on success or raises error



310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
# File 'lib/carrierwave/storage/fog.rb', line 310

def store(new_file)
  if new_file.is_a?(self.class)
    new_file.copy_to(path)
  else
    fog_file = new_file.to_file
    @content_type ||= new_file.content_type
    @file = directory.files.create({
      :body         => fog_file ? fog_file : new_file.read,
      :content_type => @content_type,
      :key          => path,
      :public       => @uploader.fog_public
    }.merge(@uploader.fog_attributes))
    fog_file.close if fog_file && !fog_file.closed?
  end
  true
end

- (Object) url(options = {})

Return url to file, if avaliable

Returns

String

url

or
NilClass

no url available



379
380
381
382
383
384
385
# File 'lib/carrierwave/storage/fog.rb', line 379

def url(options = {})
  if !@uploader.fog_public
    authenticated_url(options)
  else
    public_url
  end
end