Attchement_fu e directory public


#1

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

Qualcuno ha già affrontato questo problema?


#2

Ciao!

Non ho mai affrontato direttamente il problema, ma fortunatamente
l’hanno fatto altri e in maniera anche approfondita:
http://www.therailsway.com/2009/2/22/file-downloads-done-right

Per riassumere i passaggi, occorre:

  1. Posizionare i file fuori dalla cartella public/
  2. Intercettare le richieste di file mediante un controller
  3. 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).

Ciao,
Silvano

2009/4/17 Dboz D. removed_email_address@domain.invalid:


Posted via http://www.ruby-forum.com/.


Ml mailing list
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


Considera l’ambiente prima di stampare questa email. Dai, che
l’equazione è semplice: meno A4, più alberi.

. . . Silvano S. . . .
email: removed_email_address@domain.invalid
site: http://www.sistrall.it


#3

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)


#4

Se usi Mongrel c’è una soluzione basata su token “usa e getta” che ti
permette di bypassare il (pesante) ciclo req/res di Rails.

http://www.mail-archive.com/removed_email_address@domain.invalid/msg00254.html

Piccolo suggerimento: bypassare mi fa venire in mente Rack/Metal,
potresti estendere Rails::Rack::Static, il middleware bundled con Rails
2.3.2

Luca


#5

Luca G. wrote:

Se usi Mongrel c’� una soluzione basata su token “usa e getta” che ti
permette di bypassare il (pesante) ciclo req/res di Rails.

http://www.mail-archive.com/removed_email_address@domain.invalid/msg00254.html

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


#6

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.


#7

Marco M. wrote:

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:
http://railscasts.com/episodes/150-rails-metal

Luca


#8

Marco M. wrote:

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.

Luca


#9

Marco M. wrote:

Stavo provando ma non funziona il send_file dentro metal forse fa parte
dell’action pack?
usa Rack::File, ecco un esempio di come si utilizza:
http://github.com/rails/rails/blob/489abfd3b23f3c4b3de86aeb3bde3970771c001b/railties/lib/rails/rack/static.rb

Luca


#10

Luca G. wrote:

Marco M. wrote:

Stavo provando ma non funziona il send_file dentro metal forse fa parte
dell’action pack?
usa Rack::File, ecco un esempio di come si utilizza:
http://github.com/rails/rails/blob/489abfd3b23f3c4b3de86aeb3bde3970771c001b/railties/lib/rails/rack/static.rb

Luca

Volevo risponderti dopo aver fatto una prova ma purtroppo non sono
ancora riuscito a farla, intanto ti ringrazio per l’utile esempio


#11

Grazie a tutti per le risposte !!!
Ho optato nel cambiare il path_prefix e usare send_file
Saluti


#12

Stavo provando ma non funziona il send_file dentro metal forse fa parte
dell’action pack?