Class: FileYard
- Inherits:
-
Object
- Object
- FileYard
- Defined in:
- app/models/file_yard.rb
Constant Summary collapse
- SANE_FILE_NAME =
/[a-zA-Z0-9\-_\. ]{1,255}/
Instance Attribute Summary collapse
-
#files_path ⇒ Object
readonly
Returns the value of attribute files_path.
Instance Method Summary collapse
- #check_upload_size(actual_upload_size) ⇒ Object
- #file_path(name) ⇒ Object
- #files ⇒ Object
- #has_file?(name) ⇒ Boolean
-
#initialize(files_path, max_upload_size) ⇒ FileYard
constructor
A new instance of FileYard.
- #sanitize_file_name(name) ⇒ Object
- #upload_file(name, io) ⇒ Object
Constructor Details
#initialize(files_path, max_upload_size) ⇒ FileYard
Returns a new instance of FileYard.
8 9 10 11 12 |
# File 'app/models/file_yard.rb', line 8 def initialize(files_path, max_upload_size) @files_path, @max_upload_size = files_path, max_upload_size FileUtils.mkdir_p(@files_path) unless File.exist?(@files_path) @files = Dir["#{@files_path}/*"].collect{|path| File.basename(path) if File.file?(path) }.compact end |
Instance Attribute Details
#files_path ⇒ Object (readonly)
Returns the value of attribute files_path.
6 7 8 |
# File 'app/models/file_yard.rb', line 6 def files_path @files_path end |
Instance Method Details
#check_upload_size(actual_upload_size) ⇒ Object
51 52 53 54 55 56 |
# File 'app/models/file_yard.rb', line 51 def check_upload_size(actual_upload_size) if actual_upload_size > @max_upload_size.kilobytes raise Instiki::ValidationError.new("Uploaded file size (#{actual_upload_size / 1024} " + "kbytes) exceeds the maximum (#{@max_upload_size} kbytes) set for this wiki") end end |
#file_path(name) ⇒ Object
38 39 40 |
# File 'app/models/file_yard.rb', line 38 def file_path(name) "#{files_path}/#{name}" end |
#files ⇒ Object
30 31 32 |
# File 'app/models/file_yard.rb', line 30 def files Dir["#{files_path}/*"].collect{|path| File.basename(path) if File.file?(path)}.compact end |
#has_file?(name) ⇒ Boolean
34 35 36 |
# File 'app/models/file_yard.rb', line 34 def has_file?(name) files.include?(name) end |
#sanitize_file_name(name) ⇒ Object
44 45 46 47 48 49 |
# File 'app/models/file_yard.rb', line 44 def sanitize_file_name(name) unless name =~ SANE_FILE_NAME or name == '.' or name == '..' raise Instiki::ValidationError.new("Invalid file name: '#{name}'.\n" + "Only latin characters, digits, dots, underscores, dashes and spaces are accepted.") end end |
#upload_file(name, io) ⇒ Object
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'app/models/file_yard.rb', line 14 def upload_file(name, io) sanitize_file_name(name) if io.kind_of?(Tempfile) io.close check_upload_size(io.size) File.chmod(600, file_path(name)) if File.exists? file_path(name) FileUtils.mv(io.path, file_path(name)) else content = io.read check_upload_size(content.length) File.open(file_path(name), 'wb') { |f| f.write(content) } end # just in case, restrict read access and prohibit write access to the uploaded file FileUtils.chmod(0440, file_path(name)) end |