Sto sviluppando una applicazione protetta da sessione dove è prevista
una gestione di una web gallery.
Le immagini caricate sul server tramite attchement_fu devono essere
visibili solo a chi si autentica sul sito.
Gestendo le sessioni etc… tutto ok .
L’unica cosa è che le immagini salvati su file system sono visibili a
chiunque basta inserire nel browser l’indirizzo di una immagine
es: http://dominio/images/upload/0000/0001/azienda_thumb.jpg?1239977640
Intercettare le richieste di file mediante un controller
Usare, nel controller, il metodo send_file
Al link che ti ho indicato c’è anche spiegato come far si che a
sobbarcarsi il lavoro di spedizione effettiva non sia l’applicazione
Ruby (che non potrebbe dedicarsi ad altre cose più interessanti), ma
il server web (che per spedire file è nato e si presume lo sappia fare
bene).
Ho risposto proprio ieri alla stessa domanda sul forum in inglese eheh.
Tenendo conto di quanto scritto nel forum precedente, effettivamente la
soluzione sta nel mostrare file e documenti tramite un’azione in un
controller, alla quale evidentemente puoi applicare i vari filtri del
caso.
Quando dichiari has_attachment puoi anche indicare la cartella di
salvataggio con :path_prefix .
Puoi usare qualcosa come :path_prefix => “resources/#{table_name}”
impostando il salvataggio nella cartella resources (e non public
quindi).
Per accedere al file usi send_file, che ti consiglio di andare a vedere
nelle API, puoi anche impostare per esempio il parametro :disposition
che indica se il file va scaricato (un documento) o mostrato nel browser
(un’immagine per esempio)
Piccolo suggerimento: bypassare mi fa venire in mente Rack/Metal,
potresti estendere Rails::Rack::Static, il middleware bundled con Rails
2.3.2
Luca
Metal non l’ho mai utilizzato ma ho letto che è 25 volte più veloce di
un normale application controller di rails. Potresti indirizzare la
richiesta ad un normale controller per effettuare i controlli di
autenticazione ecc. e se passano utilizzi metal per spedire il file.
Forse in questo caso puoi fare tutto direttamente con metal
Non capisco cosa intendi con “non è veloce di suo”, se ti permette di
evitare un percorso lento di rails io questa "velocità " guadagnata la
attribuisco a questa gestione fatta col middleware, no? Rispedire il
controllo non saprei… io intendevo un redirect intercettato con metal.
Sarebbe bello fare tutto il download con metal, se è integrato con rails
non dovrebbero esserci problemi ad arrivare alle risorse
dell’applicazione solo che non avendolo mai usato non so cosa comporti.
Non capisco cosa intendi con “non è veloce di suo”, se ti permette di
evitare un percorso lento di rails io questa “velocità” guadagnata la
attribuisco a questa gestione fatta col middleware, no?
Guadagni velocità perché è meno complesso dello stack Rails e
soprattutto perché ti permette di bypassarlo.
Puoi trovare una intro qui: #150 Rails Metal - RailsCasts
Metal non l’ho mai utilizzato ma ho letto che è 25 volte più veloce di
un normale application controller di rails. Potresti indirizzare la
richiesta ad un normale controller per effettuare i controlli di
autenticazione ecc. e se passano utilizzi metal per spedire il file.
Forse in questo caso puoi fare tutto direttamente con metal
Metal non è “veloce” di suo, è solo in grado di intercettare delle
routes che gli imposti e di soddisfarne le request in modo semplice,
senza passare attraverso ActionPack.
Lo scenario da te configurato è inefficiente perché prevede proprio
l’opposto di quello per cui Metal è stato inventato, cioè bypassare lo
stack. Ha solo il vantaggio di non tenere occupato un controller per
l’invio del file, non è poco, il punto è che non credo si possa
“rispedire” il controllo ad un middleware.