class CarrierWave::SanitizedFile

SanitizedFile is a base class which provides a common API around all the different quirky Ruby File libraries. It has support for Tempfile, File, StringIO, Merb-style upload Hashes, as well as paths given as Strings and Pathnames.

It’s probably needlessly comprehensive and complex. Help is appreciated.

Attributes

file[RW]

Public Instance Methods

basename() click to toggle source

Returns the part of the filename before the extension. So if a file is called ‘test.jpeg’ this would return ‘test’

Returns

String

the first part of the filename

# File lib/carrierwave/sanitized_file.rb, line 59
def basename
  split_extension(filename)[0] if filename
end
blank?() click to toggle source
Alias for: empty?
content_type() click to toggle source

Returns the content type of the file.

Returns

String

the content type of the file

# File lib/carrierwave/sanitized_file.rb, line 218
def content_type
  return @content_type if @content_type
  @file.content_type.chomp if @file.respond_to?(:content_type) and @file.content_type
end
copy_to(new_path, permissions=nil) click to toggle source

Creates a copy of this file and moves it to the given path. Returns the copy.

Parameters

new_path (String)

The path where the file should be copied to.

permissions (Integer)

permissions to set on the copy

Returns

@return [CarrierWave::SanitizedFile] the location where the file will be stored.

# File lib/carrierwave/sanitized_file.rb, line 190
def copy_to(new_path, permissions=nil)
  return if self.empty?
  new_path = File.expand_path(new_path)

  mkdir!(new_path)
  if exists?
    FileUtils.cp(path, new_path) unless new_path == path
  else
    File.open(new_path, "wb") { |f| f.write(read) }
  end
  chmod!(new_path, permissions)
  self.class.new({:tempfile => new_path, :content_type => content_type})
end
delete() click to toggle source

Removes the file from the filesystem.

# File lib/carrierwave/sanitized_file.rb, line 207
def delete
  FileUtils.rm(self.path) if exists?
end
empty?() click to toggle source

Returns

Boolean

whether the file is valid and has a non-zero size

# File lib/carrierwave/sanitized_file.rb, line 124
def empty?
  @file.nil? || self.size.nil? || self.size.zero?
end
Also aliased as: blank?
exists?() click to toggle source

Returns

Boolean

Whether the file exists

# File lib/carrierwave/sanitized_file.rb, line 135
def exists?
  return File.exists?(self.path) if self.path
  return false
end
extension() click to toggle source

Returns the file extension

Returns

String

the extension

# File lib/carrierwave/sanitized_file.rb, line 70
def extension
  split_extension(filename)[1] if filename
end
filename() click to toggle source

Returns the filename, sanitized to strip out any evil characters.

Returns

String

the sanitized filename

# File lib/carrierwave/sanitized_file.rb, line 45
def filename
  sanitize(original_filename) if original_filename
end
Also aliased as: identifier
identifier() click to toggle source
Alias for: filename
is_path?() click to toggle source

Returns

Boolean

whether the file is supplied as a pathname or string.

# File lib/carrierwave/sanitized_file.rb, line 115
def is_path?
  !!((@file.is_a?(String) || @file.is_a?(Pathname)) && !@file.blank?)
end
move_to(new_path, permissions=nil) click to toggle source

Moves the file to the given path

Parameters

new_path (String)

The path where the file should be moved.

permissions (Integer)

permissions to set on the file in its new location.

# File lib/carrierwave/sanitized_file.rb, line 164
def move_to(new_path, permissions=nil)
  return if self.empty?
  new_path = File.expand_path(new_path)

  mkdir!(new_path)
  if exists?
    FileUtils.mv(path, new_path) unless new_path == path
  else
    File.open(new_path, "wb") { |f| f.write(read) }
  end
  chmod!(new_path, permissions)
  self.file = new_path
end
original_filename() click to toggle source

Returns the filename as is, without sanizting it.

Returns

String

the unsanitized filename

# File lib/carrierwave/sanitized_file.rb, line 29
def original_filename
  return @original_filename if @original_filename
  if @file and @file.respond_to?(:original_filename)
    @file.original_filename
  elsif path
    File.basename(path)
  end
end
path() click to toggle source

Returns the full path to the file. If the file has no path, it will return nil.

Returns

String, nil

the path where the file is located.

# File lib/carrierwave/sanitized_file.rb, line 100
def path
  unless @file.blank?
    if is_path?
      File.expand_path(@file)
    elsif @file.respond_to?(:path) and not @file.path.blank?
      File.expand_path(@file.path)
    end
  end
end
read() click to toggle source

Returns the contents of the file.

Returns

String

contents of the file

# File lib/carrierwave/sanitized_file.rb, line 147
def read
  if is_path?
    File.open(@file, "rb").read
  else
    @file.rewind if @file.respond_to?(:rewind)
    @file.read
  end
end
size() click to toggle source

Returns the file’s size.

Returns

Integer

the file’s size in bytes.

# File lib/carrierwave/sanitized_file.rb, line 81
def size
  if is_path?
    exists? ? File.size(path) : 0
  elsif @file.respond_to?(:size)
    @file.size
  elsif path
    exists? ? File.size(path) : 0
  else
    0
  end
end

Public Class Methods

new(file) click to toggle source
# File lib/carrierwave/sanitized_file.rb, line 18
def initialize(file)
  self.file = file
end