2010-08-09 9 views
5

Mi piacerebbe poter caricare un file zip nella mia applicazione Rails che contiene un numero di immagini. Quindi vorrei che Rails decomprimasse quel file e collegasse le immagini all'interno del modello della mia foto tramite Paperclip, in modo che fossero in definitiva archiviati sul mio account Amazon S3 (configurato tramite Paperclip).Caricamento e decompressione di file su S3 tramite Rails ospitati su Heroku?

Mi piacerebbe fare tutto questo sul mio sito Rails ospitato su Heroku, che purtroppo non consente l'archiviazione locale di alcun tipo (per quanto ne so) per fare temporaneamente la decompressione prima dell'analisi di Paperclip.

Come faccio?

risposta

4

Suggerirei di caricare direttamente su S3 che ignora completamente Heroku in modo da non essere limitato al timeout della richiesta di 30 secondi che impone (che diminuisce i tuoi upload dopo quel momento) o al limite di 1gb /tmp. Dopo aver caricato il file, puoi creare un POST per l'app Rails con il nome e la posizione del file e quindi eseguire l'operazione di decompressione. Se desideri utilizzare Paperclip per la post-elaborazione, ho allegato un link qui sotto. Se si finisce la procedura di caricamento direttamente su S3 che scarica il lavoro dal proprio server Rails, si prega di controllare i miei progetti di esempio:

Progetto di esempio utilizzando Rails 3, Flash e MoorTools FancyUploader per caricare direttamente su S3: https://github.com/iwasrobbed/Rails3-S3-Uploader-FancyUploader

progetto

campione utilizzando Rails 3, Flash/Silverlight/GoogleGears/BrowserPlus e jQuery-based Plupload di caricare direttamente a S3: https://github.com/iwasrobbed/Rails3-S3-Uploader-Plupload

ecco il link per la lavorazione Paperclip postale per un esempio come le immagini:

http://www.railstoolkit.com/posts/fancyupload-amazon-s3-uploader-with-paperclip

1

Heroku consente di scrivere su #{RAILS_ROOT}/tmp.

Ma è necessario tenere presente che il file sarà lì solo finché dura la richiesta. Probabilmente più lungo, ma non è garantito. Potresti provare a bloccare la richiesta mentre decomprimi e invia a S3, ma dovresti occuparti del tempo necessario.

Mi sembra che tu abbia bisogno di un flash uploader che può decomprimere e inviare a S3, senza Heroku.

+0

Ma sarei in grado di creare ancora le mie associazioni Paperclip nella mia app Rails se ho usato un uploader flash che ha bypassato Heroku? Un po 'confuso qui. – neezer

+0

C'è un po 'di problemi con i file esistenti dopo aver migrato il DB per usare papercliop.Puoi letteralmente impostare il tuo model.attachment su un file come elencato qui. Potrebbe aiutarti in quello che stai cercando di fare: http://thewebfellas.com/blog/2008/11/2/goodbye-attachment_fu-hello-paperclip –

2

dmagkic è corretto su root_root/tmp. Mi raccomando qualcosa come le seguenti:

  • Carica file tramite Heroku a S3
  • Setup un processo in background per comprimere i file (memorizzare i nomi dei file che avete bisogno di gruppo)
  • eseguire il BJ che scarica il file da S3, li elimina, invia lo zip a S3, rimuove i file decompressi.

In questo modo l'applicazione sarà ancora disponibile durante il processo di caricamento.

Se si tenta di caricare più file, si potrebbe scrivere in/tmp, ma assicurarsi solo che tutti i file si incontrino nella stessa richiesta di post.

+0

Hai rovesciato le cose: voglio * caricare un file zip * e avere Rails * memorizza i file decompressi *. Non sono ancora chiaro per quanto tempo devo lavorare con i file in '# {RAILS_ROOT}/tmp', tuttavia: persistono fino alla prossima richiesta o scadono prima? E la richiesta deve essere per la stessa azione o qualsiasi richiesta per l'applicazione? – neezer

+0

OK, cambia le cose un po '. Carica lo ZIP in S3 usando la graffetta e fai un lavoro in background per decomprimere ed elaborare i file. Una richiesta è 1 azione HTTP, non hai più tempo in/tmp di quello. –