Le gem principale per l’upload di file è CarrierWave
Per prima cosa è necessario creare un oggetto Uploader:
che crea il seguente file
CarrierWave fornisce un metodo store per lo storage permanenete e un metodo cache per lo storage temporaneo.
Una volta ceh è stato definito un uploader come AvatarUploader, posso salvare un file (o reperirlo) con le seguenti istruzioni:
Configurazione del model
Devo agginugere una colonna al model in cui voglio inserire l’uploader:
e poi, nella dichiarazione del model, scrivo:
Ora posso memorizzare i file assegnandoli come attributi del model:
Estensioni ammesse
Per poter permettere file solo con determinate estensioni basta aggiungere il metodo extension_white_list all’uploader
Versioni per il file
Voglio poter permettere varie versioni dello stesso file, con caratteristiche diverse (un classico esempio sono le thumbnail).
Per esempio, vogliamo che un’immagine caricata non sia mai più larga di 800x800, inoltre creo automaticamente una thumb croppata a 200x200
Aggiorno l’uploader così:
Ottengo quindi:
Versioni innestate
Posso anche innestare le versioni:
Versioni condizionali
Posso creare una versione di un file solo se il model (variabile model, riferita al model a cui l’uploader è riferito) soddisfa determinate caratteristiche
Mantenere un upload anche se la validazione fallisce
In alcune piattaforme, il file caricato scompare se la validazione del form di inserimento fallisce obbligando l’utente a ricaricare tutto. Questo comportamento è avitabile usando un campo hidden avatar_cache (assumendo che il nome dell’upload sia avatar) che verrà valorizzato con il file già caricato dall’utente senza che questo se ne accorga.
Posso inserire una thumnail, per esempio, per far capire all’utente che il file esiste ed è stato caricato correttamente
Rimuovere un file caricato
Posso o chiamare il metodo remove_avatar! da controller, oppure usare un checkbox di questo tipo nelle views:
Caricare un file tramite un URL
Fornire un URL di default
Spesso, sopratutto con le immagini, conviene fornire un URL di defualt nel caso in cui l’utente non carichi nessun file. Per fornire un url di default da utilizzare posso usare il metodo default_url nell’uploader
Configurazioni
Per configurare CarrierWave basta creare il file config/initializers/carrierwave.rb e inserirvi config come questa di esempio:
Test
Conviene testare utilizzando uno storage locale e non remoto, con la seguente configurazione:
Rspec
CarrierWave possiede dei matcher rspec molto comodi, di seguito un esempio:
Amazon S3
Per permettere il caricamento su S3 è necessaria la gem fog, devo fornire i fog_credentials e la fog_directory in un initializer (ricorda che la fog_directory deve essere creata prima)
Di seguito un esempio di configurazione per amazon S3:
Nell’uploader devo settare lo storage a :fog:
Per ottenere l’url del file memorizzato funziona in maniera trasparente il metodo url dell’uploader (CarrierWave::Uploader#url)
carrierwave-aws
Al posto di fog conviene usare carrierwave-aws che è pensata solo per amazon, molto più leggera e versatile.
Manipolare immagini
CarrierWave fornisce una semplice libreria di elaborazione immagini che permette di cambiarne il formato, ridimensionarle…