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

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

Constant Summary

Constants included from Utilities::Uri

Utilities::Uri::SAFE_STRING, Utilities::Uri::UNSAFE

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(uploader, base, path) ⇒ File

Returns a new instance of File.



265
266
267
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 265

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



162
163
164
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 162

def path
  @path
end

Instance Method Details

#attributesObject

Return all attributes from file

=== Returns

[Hash] attributes from file



171
172
173
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 171

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



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

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)
    expire_at = ::Fog::Time.now + @uploader.fog_authenticated_url_expiration
    case @uploader.fog_credentials[:provider]
      when 'AWS'
        local_file.url(expire_at, options)
      when 'Rackspace'
        connection.get_object_https_url(@uploader.fog_directory, path, expire_at, options)
      when 'OpenStack'
        connection.get_object_https_url(@uploader.fog_directory, path, expire_at)
      else
        local_file.url(expire_at)
    end
  end
end

#content_typeObject

Lookup value for file content-type header

=== Returns

[String] value of content-type



211
212
213
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 211

def content_type
  @content_type || !file.nil? && 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



222
223
224
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 222

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:



409
410
411
412
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 409

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



233
234
235
236
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 233

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)


296
297
298
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 296

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



245
246
247
248
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 245

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



393
394
395
396
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 393

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

#headersObject

deprecated: All attributes from file (includes headers)

=== Returns

[Hash] attributes from file



257
258
259
260
261
262
263
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 257

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



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
363
364
365
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 332

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].to_s
    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'
      file = directory.files.get(encoded_path)
      file.nil?? "" : file.public_url
    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



275
276
277
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 275

def read
  file.body
end

#sizeObject

Return size of file body

=== Returns

[Integer] size of file body



286
287
288
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 286

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



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

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



376
377
378
379
380
381
382
# File 'vendor/carrierwave/lib/carrierwave/storage/fog.rb', line 376

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