Class: CarrierWave::SanitizedFile

Inherits:
Object
  • Object
show all
Defined in:
lib/carrierwave/sanitized_file.rb

Overview

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.

Class Attribute Summary (collapse)

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (SanitizedFile) initialize(file)



29
30
31
# File 'lib/carrierwave/sanitized_file.rb', line 29

def initialize(file)
  self.file = file
end

Class Attribute Details

+ (Object) sanitize_regexp



24
25
26
# File 'lib/carrierwave/sanitized_file.rb', line 24

def sanitize_regexp
  @sanitize_regexp ||= /[^a-zA-Z0-9\.\-\+_]/
end

Instance Attribute Details

- (Object) file

Returns the value of attribute file



19
20
21
# File 'lib/carrierwave/sanitized_file.rb', line 19

def file
  @file
end

Instance Method Details

- (Object) basename

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



70
71
72
# File 'lib/carrierwave/sanitized_file.rb', line 70

def basename
  split_extension(filename)[0] if filename
end

- (Object) content_type

Returns the content type of the file.

Returns

String

the content type of the file



250
251
252
253
254
255
256
257
# File 'lib/carrierwave/sanitized_file.rb', line 250

def content_type
  return @content_type if @content_type
  if @file.respond_to?(:content_type) and @file.content_type
    @content_type = @file.content_type.to_s.chomp
  elsif path
    @content_type = ::MIME::Types.type_for(path).first.to_s
  end
end

- (Object) content_type=(type)

Sets the content type of the file.

Returns

String

the content type of the file



266
267
268
# File 'lib/carrierwave/sanitized_file.rb', line 266

def content_type=(type)
  @content_type = type
end

- (CarrierWave::SanitizedFile) copy_to(new_path, permissions = nil, directory_permissions = nil)

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

directory_permissions (Integer)

permissions to set on created directories.

Returns



210
211
212
213
214
215
216
217
218
219
220
221
222
# File 'lib/carrierwave/sanitized_file.rb', line 210

def copy_to(new_path, permissions=nil, directory_permissions=nil)
  return if self.empty?
  new_path = File.expand_path(new_path)

  mkdir!(new_path, directory_permissions)
  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

- (Object) delete

Removes the file from the filesystem.



227
228
229
# File 'lib/carrierwave/sanitized_file.rb', line 227

def delete
  FileUtils.rm(self.path) if exists?
end

- (Boolean) empty?

Returns

Boolean

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



135
136
137
# File 'lib/carrierwave/sanitized_file.rb', line 135

def empty?
  @file.nil? || self.size.nil? || (self.size.zero? && ! self.exists?)
end

- (Boolean) exists?

Returns

Boolean

Whether the file exists



144
145
146
147
# File 'lib/carrierwave/sanitized_file.rb', line 144

def exists?
  return File.exists?(self.path) if self.path
  return false
end

- (Object) extension

Returns the file extension

Returns

String

the extension



81
82
83
# File 'lib/carrierwave/sanitized_file.rb', line 81

def extension
  split_extension(filename)[1] if filename
end

- (Object) filename Also known as: identifier

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

Returns

String

the sanitized filename



56
57
58
# File 'lib/carrierwave/sanitized_file.rb', line 56

def filename
  sanitize(original_filename) if original_filename
end

- (Boolean) is_path?

Returns

Boolean

whether the file is supplied as a pathname or string.



126
127
128
# File 'lib/carrierwave/sanitized_file.rb', line 126

def is_path?
  !!((@file.is_a?(String) || @file.is_a?(Pathname)) && !@file.blank?)
end

- (Object) move_to(new_path, permissions = nil, directory_permissions = nil, keep_filename = false)

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.

directory_permissions (Integer)

permissions to set on created directories.



178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/carrierwave/sanitized_file.rb', line 178

def move_to(new_path, permissions=nil, directory_permissions=nil, keep_filename=false)
  return if self.empty?
  new_path = File.expand_path(new_path)

  mkdir!(new_path, directory_permissions)
  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)
  if keep_filename
    self.file = {:tempfile => new_path, :filename => original_filename}
  else
    self.file = new_path
  end
  self
end

- (Object) original_filename

Returns the filename as is, without sanitizing it.

Returns

String

the unsanitized filename



40
41
42
43
44
45
46
47
# File 'lib/carrierwave/sanitized_file.rb', line 40

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

- (Object) path

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.



111
112
113
114
115
116
117
118
119
# File 'lib/carrierwave/sanitized_file.rb', line 111

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

- (Object) read

Returns the contents of the file.

Returns

String

contents of the file



156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/carrierwave/sanitized_file.rb', line 156

def read
  if @content
    @content
  elsif is_path?
    File.open(@file, "rb") {|file| file.read}
  else
    @file.rewind if @file.respond_to?(:rewind)
    @content = @file.read
    @file.close if @file.respond_to?(:close) && @file.respond_to?(:closed?) && !@file.closed?
    @content
  end
end

- (Object) sanitize_regexp

Used to sanitize the file name. Public to allow overriding for non-latin characters.

Returns

Regexp

the regexp for sanitizing the file name



277
278
279
# File 'lib/carrierwave/sanitized_file.rb', line 277

def sanitize_regexp
  CarrierWave::SanitizedFile.sanitize_regexp
end

- (Object) size

Returns the file's size.

Returns

Integer

the file's size in bytes.



92
93
94
95
96
97
98
99
100
101
102
# File 'lib/carrierwave/sanitized_file.rb', line 92

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

- (Object) to_file

Returns a File object, or nil if it does not exist.

Returns

File

a File object representing the SanitizedFile



238
239
240
241
# File 'lib/carrierwave/sanitized_file.rb', line 238

def to_file
  return @file if @file.is_a?(File)
  File.open(path, "rb") if exists?
end