Extracted storage of files functionality from controller to an object called FileYard.

There is one file yard per web.
This commit is contained in:
Alexey Verkhovsky 2005-01-23 01:36:51 +00:00
parent 0d81292168
commit 1d82582c3b
7 changed files with 112 additions and 54 deletions

43
app/models/file_yard.rb Normal file
View file

@ -0,0 +1,43 @@
require 'instiki_errors'
class FileYard
attr_reader :files_path
def initialize(files_path)
@files_path = files_path
@files = Dir["#{files_path}/*"].collect{|path| File.basename(path) if File.file?(path) }.compact
end
def upload_file(name, io)
sanitize_file_name(name)
if io.kind_of?(Tempfile)
io.close
FileUtils.mv(io.path, file_path(name))
else
File.open(file_path(name), 'wb') { |f| f.write(io.read) }
end
end
def files
Dir["#{files_path}/*"].collect{|path| File.basename(path) if File.file?(path)}.compact
end
def has_file?(name)
files.include?(name)
end
def file_path(name)
"#{files_path}/#{name}"
end
SANE_FILE_NAME = /[-_\.A-Za-z0-9]{1,255}/
def sanitize_file_name(name)
unless name =~ SANE_FILE_NAME
raise Instiki::ValidationError.new("Invalid file name: '#{name}'.\n" +
"Only latin characters, digits, dots, underscores and dashes are accepted.")
end
end
end