Walidacja uploadowanego pliku

Witam

Chciałem napisać coś prostego do obsługi plików, bez używania pluginu ponieważ chciałbym się czegoś nauczyć.
Pliki są przechowywane na dysku, natomiast w w bazie mam nazwę pliku (doc:string).

Jak do tej pory mam coś takiego:

##VIEW

<%= file_field "offer", "uploaded_doc" %>

##MODEL - offer.rb

[code]def uploaded_doc=(doc_field)
if doc_field.size > 0

Sanitize

sanitized_file = sanitize_filename(doc_field.original_filename)
self.doc = sanitized_file

Copy file

File.open(“public/docs/offers/#{sanitized_file}”, “w”) { |f| f.write(doc_field.read)}
end
end

def sanitize_filename(value)

IE

just_filename = value.gsub(/^.*(\|/)/, ‘’)

non alpha_numeric to “_”

@filename = just_filename.gsub(/[^\w.-]/,’_’)

convert regional letters to ASCII

@filename.to_unix_filename
end[/code]
To działa, natomiast nie wiem jak do tego wprowadzić walidację na format pliku oraz na wielkość pliku.

Na format pliku myśle że mógłbym użyć doc_field.content_type i sprawdzić czy jest included w arrayu
np [‘application/pdf’, ‘application/msword’, ‘text/plain’], z tymże nie mam pojęcia jak to dodać do normalnej walidacji.

Co do rozmiaru to z tego co czytałem muszę zrobić temp_file, którego będe usuwał po uploadzie jeśli plik będzie za duży a jeśli będzie dobry to zostaje na dysku. Tak czy owak nie wiem zabardzo jak to zakodować.

pozdrawiam

PS. Jedzie ktoś z forum na RailsConf Europe?

a)
Mozesz uzyc do validacji metody validate http://www.railsbrain.com/test/rails-1.2.3/doc/index.html?a=M001417&name=validate
b) mozesz stowrzyc wlasna metode np validate_file_type i skorzystac z callbacku before_save lub before_validation

W obu przypadkach korzystasz z metody Error.add

http://www.railsbrain.com/test/rails-1.2.3/doc/index.html?a=M001447&name=Errors.add

Jesli chodzi o upload pliku to mozna usuwac niedobry po skonczone validacji (jesli plik jej nie prpzeszedl)

Prosty rpzyklad uzycia validate

def validate if self.internal internal_intranet = IntranetItem.find(:first, :conditions => 'internal = 1') if internal_intranet && self.id != internal_intranet.id self.errors.add('internal', _('There can be only one Instance of Internal Intranet')) end end unless self.location_name.blank? client_id = self.location_name[/\d+/].to_i if client_id && !Client.find_by_id(client_id) self.errors.add('location_name', _("You choose Client that doesn't exists")) end end end

Zobacz plugin upload_column.