Upload pliku na serwer

Witam,
chciałbym zapisywać pliku przekazywane z formularza na serwerze w określonym katalogu. Formularz oczywiście umożliwia wysyłanie pliku. Stworzyłem akcesor, który to przechwytuje plik i ma zapisywać do bazy danych oraz do wybranego katalogu.

[code]
PRODUCTS_DIRECTORY = “#{RAILS_ROOT}/public/product_images/”

def uploaded_picture=(picture_field)
if picture_field != “”
self.picture_name = base_part_of(picture_field.original_filename)
self.picture_content_type = picture_field.content_type.chomp
self.picture = picture_field.read

  directory = Product::PRODUCTS_DIRECTORY + self.producer.name + "/" + self.name
  FileUtils.mkdir_p directory
  # create the file path
  path = File.join(directory, self.picture_name)
  # write the file
  File.open(path, "wb") { |f| f.write(picture_field.read) }
end

end[/code]
Co prawda plik jest zapisywany do bazy danych poprawnie, ale już w przypadku wybranego katalogu nie do końca prawidłowo, bo jego rozmiar zawsze wynosi 0b. Czy zna ktoś może powód i rozwiązanie tego problemu?

Co sądzisz o użyciu Paperclip: http://github.com/thoughtbot/paperclip ?

Ciekawy pomysł, może skorzystam, jednak póki co chciałbym się dowiedzieć co jest przyczyną, że w moim kodzie plik nie jest zapisywany poprawnie.

Wykonujesz na picture_field 2 razy metodę read. Przy pierwszym odczytaniu wskaźnik na aktualny znak w pliku jest ustawiony na koniec pliku. Dlatego za drugim razem read zwraca nil. Można by przewinąć wskaźnik na początek pliku, ale czytanie pliku 2 razy jest mało wydajne. Najlepiej użyj już tego przeczytanego: self.picture, czyli:

File.open(path, "wb") { |f| f.write(self.picture) }

Co za głupi błąd.
Dzięki drogus