Che cos'è un modo Ruby on Rails per salvare le immagini?

9

Mi sviluppo su iOS e sto passando da un PHP torna a Ruby on Rails. Il formato di interscambio è JSON .

Una rapida ricerca su Google per 'salvare le immagini in Rails' ha quasi tutti i risultati che parlano del salvataggio dei dati dell'immagine come BLOB nel database. Potrei sbagliarmi, ma ho l'impressione che il salvataggio dei dati di immagine in un database sia un enorme spreco di tempo e spazio (a differenza del salvataggio di un collegamento al percorso del file ('/img/subcat/4656.png') .

In PHP, è piuttosto normale ricevere i dati, generare un nome file, salvare il file su disco e aggiornare il database con la posizione dell'immagine su disco. È lo stesso per Ruby on Rails, o c'è qualche funzionalità di immagine ActiveRecord integrata di cui non sono a conoscenza?

    
posta user 28.09.2013 - 21:45
fonte

2 risposte

4

Quello che ho fatto in passato è usare PaperClip con Amazon S3 e CloudFront CDN per una consegna più rapida. PaperClip supporta lo storage S3 molto bene fuori dalla scatola: vedi la loro documentazione per le opzioni di configurazione dello storage S3 .

  1. Configura una distribuzione CloudFront per inoltrare le richieste di immagini al tuo bucket S3 e altre richieste di risorse statiche all'applicazione Ruby on Rails (in alternativa, puoi caricarle anche su S3, ma questo non rientra nell'ambito di questa domanda).
  2. CNAME un dominio che controlli (come assets.example.com) per indicare la tua distribuzione CloudFront.
  3. Nella configurazione PaperClip, imposta s3_host_alias: assets.example.com . Ciò causerà la generazione di URL generati su risorse di immagini salvate per utilizzare l'host di distribuzione CloudFront.
  4. Nella configurazione di Ruby on Rails, puoi fare config.action_controller.asset_host = http://assets.example.com . Gli URL degli asset di Ruby on Rails utilizzeranno anche la tua distribuzione CloudFront, per la memorizzazione nella cache / una consegna più rapida.

Questo è piuttosto approssimativo, ma si spera che punti in direzione di alcune risorse utili. Certo, questa è solo una soluzione, ma è una di quelle che ha funzionato per me in una situazione in cui avevo a che fare con centinaia di migliaia di allegati di immagini nel database.

(Come possibile passaggio avanzato che potrebbe non essere necessario o utile per il tuo caso, puoi anche impostare più CNAME per la tua distribuzione CloudFront, come assets0.example.com e assets1.example.com . Sia paperclip s3_host_alias e action_controller.asset_host può quindi assumere lambda che ti consente di determinare in modo deterministico (in base alla risorsa) URL che utilizzano host diversi, per una migliore parallelizzazione se stai scaricando un gruppo di essi sulla stessa pagina, poiché i browser limiteranno le connessioni simultanee massime a lo stesso host.)

    
risposta data 10.10.2013 - 20:06
fonte
3

Ho provato diverse gemme, ma ora sto usando FineUploader insieme a paperClip

FineUploader gestisce gran parte della GUI per te, ad esempio avanzamento del caricamento, trascinamento della selezione e più caricamenti di file, e così via. Uso PaperClip perché voglio memorizzare le immagini sui miei server anziché su S3.

Quello che facciamo normalmente è cercare una soluzione configurabile pronta all'uso, invece di ricreare tutto da zero. Con PaperClip memorizzo le immagini e con StateMachine faccio delle conversioni sulle immagini e le inserisco in una categoria basata sul nome del file. Ho avuto la stessa domanda che hai avuto, e questa è stata la mia migliore soluzione di lavoro, è per questo che la condivido.

    
risposta data 03.11.2013 - 08:41
fonte

Leggi altre domande sui tag