2011-01-27 15 views
6

La mia applicazione utilizza il backend Rails 2, Heroku per l'hosting, Paperclip per il caricamento di file e Amazon S3 per l'archiviazione di file.Scarica file con clic - Ruby on Rails

In questo momento gli utenti possono caricare file con paperclip + s3 - questo funziona perfettamente. Dopo il caricamento, appare un'icona sulla loro bacheca, collegata al percorso del file (nel secchio s3). Quando si fa clic sull'icona, il browser apre il file in una nuova finestra (per la maggior parte dei tipi di file: PDF, MP3, img, ecc.). Invece di aprire, voglio che il file venga scaricato automaticamente quando l'utente fa clic sull'icona del file (come gli allegati Gmail). La soluzione dovrebbe essere in grado di funzionare per qualsiasi tipo di file e cross-browser.

C'è un aiuto per farlo in rotaie, o è necessario il javascript? Sono davvero bloccato su questo, quindi qualsiasi cosa per indicarmi la giusta direzione sarebbe molto apprezzato. Grazie!

risposta

10

prova le seguenti:

class Test < ActiveRecord::Base 

    has_attached_file :testfile, 
    :storage => :s3, 
    # All your S3 config 
    :s3_headers => {"Content-Disposition" => "attachment"} 

end 

Questo dovrebbe dire al Paperclip Gem per impostare il "Content-Disposition" intestazione per il valore "allegato" per i file appena caricati.

Nota che devi modificare manualmente il file già caricato, ad es. con Cyberduck o un altro client FTP.

+1

Grazie per il suggerimento! Solo FYI, penso che tu abbia un tipo qui. '{" Content-Disposition ":" attachment "}' ha lanciato un errore ma '{" Content-Disposition "=>" attachment "}' ha funzionato correttamente. – aguynamedloren

+0

'{" Content-Disposition ":" attachment "}' solo Ruby 1.9. Usa '{" Content-Disposition "=>" attachment "}' se hai ancora 1.8. – x1a4

2

Quando si trasferisce il file, è necessario impostare un'intestazione Content-Disposition con un valore di attachment; filename=yourfilename.pdf. Se è trasferito direttamente da S3, dovrai dire a S3 di impostare anche le intestazioni Content-Disposition. Forse anche Content-Type.

Si noti che se si specifica a S3 di associare un'intestazione Content-Disposition, sarà sempre trasmettere questa intestazione.

FWIW, ecco la documentazione di Amazon di fare un PUT per un oggetto: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectPUT.html