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

#initialize(uploader, base, path) ⇒ File

Returns a new instance of File.


263
264
265
# File 'lib/carrierwave/storage/fog.rb', line 263

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

Instance Attribute Details

#pathObject (readonly)

Current local path to file

Returns

String

a path to file


164
165
166
# File 'lib/carrierwave/storage/fog.rb', line 164

def path
  @path
end

Instance Method Details

#attributesObject

Return all attributes from file

Returns

Hash

attributes from file


173
174
175
# File 'lib/carrierwave/storage/fog.rb', line 173

def attributes
  file.attributes
end

#authenticated_url(options = {}) ⇒ Object

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


187
188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/carrierwave/storage/fog.rb', line 187

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
  end
end

#content_typeObject

Lookup value for file content-type header

Returns

String

value of content-type


209
210
211
# File 'lib/carrierwave/storage/fog.rb', line 209

def content_type
  @content_type || file.content_type
end

#content_type=(new_content_type) ⇒ Object

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

Returns

String

returns new content type value


220
221
222
# File 'lib/carrierwave/storage/fog.rb', line 220

def content_type=(new_content_type)
  @content_type = new_content_type
end

#copy_to(new_path) ⇒ CarrierWave::Storage::Fog::File

Creates a copy of this file and returns it.

Parameters

new_path (String)

The path where the file should be copied to.

Returns

Returns:


406
407
408
409
# File 'lib/carrierwave/storage/fog.rb', line 406

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

#deleteObject

Remove the file from service

Returns

Boolean

true for success or raises error


231
232
233
234
# File 'lib/carrierwave/storage/fog.rb', line 231

def delete  # avoid a get by just using local reference

  directory.files.new(:key => path).destroy
end

#exists?Boolean

Check if the file exists on the remote service

Returns

Boolean

true if file exists or false

Returns:

  • (Boolean)

294
295
296
# File 'lib/carrierwave/storage/fog.rb', line 294

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

#extensionObject

Return extension of file

Returns

String

extension of file or nil if the file has no extension


243
244
245
246
# File 'lib/carrierwave/storage/fog.rb', line 243

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

#filename(options = {}) ⇒ Object

Return file name, if available

Returns

String

file name

or
NilClass

no file name available


390
391
392
393
# File 'lib/carrierwave/storage/fog.rb', line 390

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

#headersObject

deprecated: All attributes from file (includes headers)

Returns

Hash

attributes from file


255
256
257
258
259
260
261
# File 'lib/carrierwave/storage/fog.rb', line 255

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

#public_urlObject

Return a url to a public file, if available

Returns

String

public url

or
NilClass

no public url available


330
331
332
333
334
335
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
# File 'lib/carrierwave/storage/fog.rb', line 330

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

#readObject

Read content of file from service

Returns

String

contents of file


273
274
275
# File 'lib/carrierwave/storage/fog.rb', line 273

def read
  file.body
end

#sizeObject

Return size of file body

Returns

Integer

size of file body


284
285
286
# File 'lib/carrierwave/storage/fog.rb', line 284

def size
  file.nil? ? 0 : file.content_length
end

#store(new_file) ⇒ Object

Write file to service

Returns

Boolean

true on success or raises error


304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
# File 'lib/carrierwave/storage/fog.rb', line 304

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

#url(options = {}) ⇒ Object

Return url to file, if avaliable

Returns

String

url

or
NilClass

no url available


373
374
375
376
377
378
379
# File 'lib/carrierwave/storage/fog.rb', line 373

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