Dopo una serie di articoli riguardanti il mondo “Java“, ho pensato che forse era meglio prendere una boccata d’aria fresca e parlare di qualcosa di più Esotico, tipo il framework ruby on rails.

Durante lo sviluppo di qualche mini applicazione web in rails (puramente a scopo “didattico”) ho riscontrato qualche problemino durante il caricamento di file.

Qui di seguito ho definito i principali passi per permettere l’upload di un file

Ipotizziamo di voler aggiungere un immagine all’interno della sezione “clients“, memorizzando su DB (colonna img) il nome del file caricato e salvando il file vero e proprio in /public/images

Pagina .rhtml:
<form action=”/clients/create” method=”POST” enctype=”multipart/form-data” />
…..
<%= file_field ‘client’, ‘img’ %></p>
<%= submit_tag “Create” %>

All’interno del controller clients_controller.rb, metodo create:
def create
@client = Client.new(params[:client])
#Upload file, salvataggio in public/images/…
File.open(”#{RAILS_ROOT}/public/images/#{@params[’client’][’img’].original_filename()}”, “wb”) do |f|
f.write(@params[’client’][’img’].read)
end
@client.img = @params[’client’][’img’].original_filename()
…..
end

Se le vostre esigenze prevedono una serie di operazioni e/o controlli sul file caricato vi consiglio il modulo “FileColumn“, realizzato da Sebastian Kanthak, che integra la libreria RMagick per manipolare immagini et similia.

Tanto per darvi un piccolo assaggio di ciò che è possibile fare con poche righe di codice, guardate come è possibile salvare sul filesystem l’immagine ridimensionata:

(Nota è importate modificare l’Active Record)
class Entry < ActiveRecord::Base
file_column :img, :magick => { :geometry => “640×480>” }
end

pagina .rhtml
<%= file_column_field “client”, “img” %>

… e se volessi salvare una versione a 640×480 e anche un’anteprima a 50×50? easy:
class Entry < ActiveRecord::Base
file_column :img, :magick => {
:versions => { “thumb” => “50×50″, “medium” => “640×480>” } }
end