### Model ### def file=(uploaded_file) @uploaded_file = uploaded_file @filename = sanitize_filename(@uploaded_file.original_filename) write_attribute("content_type", @uploaded_file.content_type) end def after_create if !File.exists?(File.dirname(path_to_file)) Dir.mkdir(File.dirname(path_to_file)) end if @uploaded_file.instance_of?(Tempfile) FileUtils.copy(@uploaded_file.local_path, path_to_file) else File.open(self.path_to_file, "wb") { |f| f.write(@uploaded_file.read) } end write_attribute("file", path_to_file) end def after_destroy if File.exists?(self.file) File.delete(self.file) Dir.rmdir(File.dirname(self.file)) end end def path_to_file File.expand_path("#{RAILS_ROOT}/upload/#{self.id}/#{@filename}") end private def sanitize_filename(file_name) # get only the filename, not the whole path (from IE) just_filename = File.basename(file_name) # replace all none alphanumeric, underscore or perioids with underscore just_filename.gsub(/[^\w\.\_]/,'_') end ### View ### ... <input type="file" name="model[file]" /> ...
FileUtils.mkdir_p() seemed far more effective, as it can create complete paths (directory and any necessary parent directories):
Options: mode noop verbose
Creates a directory and all its parent directories. For example,
FileUtils.mkdir_p '/usr/local/lib/ruby'
causes to make following directories, if it does not exist.
* /usr
* /usr/local
* /usr/local/lib
* /usr/local/lib/ruby
You can pass several directories at a time in a list.
So basically I replaced the two appearances of Dir.mkdir() with FileUtils.mkdir_p() and it worked perfectly.
class SingleFile < ActiveRecord::Base def file=(uploaded_file) @uploaded_file = uploaded_file @filename = sanitize_filename(@uploaded_file.original_filename) write_attribute(:content_type, @uploaded_file.content_type) end def after_create if !File.exists?(File.dirname(self.path)) FileUtils.mkdir_p(File.dirname(self.path)) end if @uploaded_file.instance_of?(Tempfile) FileUtils.copy(@uploaded_file.local_path, self.path) else File.open(self.path, "wb") { |f| f.write(@uploaded_file.read) } end write_attribute(:file, self.simple_path) self.save end def after_destroy if File.exists?(self.file) File.delete(self.file) Dir.rmdir(File.dirname(self.file)) end end def simple_path "#{self.id}/#{@filename}" end def path File.expand_path("#{RAILS_ROOT}/public/files/#{self.id}/#{@filename}") end private def sanitize_filename(file_name) # get only the filename, not the whole path (from IE) just_filename = File.basename(file_name) # replace all none alphanumeric, underscore or perioids with underscore just_filename.gsub(/[^\w\.\_]/,'_') end end
i am developping a web rails application and the difficuty is to upload file in a parametre path and also i must save other information in Upload_FILE table
i want to create a function
upload_file(file,path) that save file in path
can you help me
You need to create an account or log in to post comments to this site.
I put the new lines in the def file=(uploaded_file) method, and here they are...
self.content_type = @uploaded_file.content_type self.file = path_to_file