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


9

Sviluppo su iOS e sto passando da un backend PHP a Ruby on Rails. Il formato di interscambio è JSON .

Una rapida ricerca su Google di "salvare immagini in Rails" ha quasi tutti i risultati relativi al salvataggio dei dati delle immagini 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 (al contrario di salvare un collegamento alla posizione del file ('/img/subcat/4656.png') .

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


1
Mi sono imbattuto in PaperClip , che sembra essere abbastanza vicino a quello che voglio. Gradirei comunque i consigli degli esperti di Rails su come gestire la ricezione e la ricezione di migliaia di immagini a velocità ottimale.
utente

1
Sai che l'immagine occuperà lo stesso spazio su db o su disco, giusto? Per istinto, direi che Rails memorizza nel database perché non si basa su Apache tanto quanto PHP per gestire la cache. Potrebbe essere completamente sbagliato però.
Florian Margaine,

2
Sì, non credo che i dati dell'immagine verranno manipolati dalla posizione di archiviazione. Le rotaie potrebbero essere diverse, ma alcuni membri SO affidabili sembrano inclinarsi verso i percorsi dei file nel database. Inoltre, penso che sia risaputo che i database sono difficili da ridimensionare, quindi l'archiviazione di tonnellate di dati di immagini nel database non lo renderà sicuramente più semplice.
utente

Risposte:


4

Quello che ho fatto in passato è usare PaperClip con Amazon S3 e CloudFront CDN per una consegna più rapida. PaperClip supporta l'archiviazione S3 molto bene e pronta all'uso: consultare la documentazione per le opzioni di configurazione dell'archiviazione S3 .

  1. Imposta una distribuzione CloudFront per inoltrare richieste di immagini al tuo bucket S3 e altre richieste di risorse statiche alla tua applicazione Ruby on Rails (in alternativa, puoi anche caricarle su S3, ma non rientra nell'ambito di questa domanda).
  2. CNAME un dominio che controlli (come assets.example.com) per puntare alla tua distribuzione CloudFront.
  3. Nella configurazione PaperClip, impostare s3_host_alias: assets.example.com. Ciò farà sì che gli URL generati per le risorse di immagine salvate utilizzino l'host di distribuzione CloudFront.
  4. Nella configurazione di Ruby on Rails, puoi farlo config.action_controller.asset_host = http://assets.example.com. Gli URL delle risorse di Ruby on Rails useranno anche la tua distribuzione CloudFront, per la memorizzazione nella cache / consegna più veloce.

È piuttosto abbozzato, ma si spera ti indirizzi verso alcune risorse utili. Naturalmente, questa è solo una soluzione, ma è quella 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.come assets1.example.com. Sia la graffetta s3_host_aliasche action_controller.asset_hostquindi può prendere lambda che ti permetteranno di deterministicamente (in base al risorsa) genera URL che utilizzano host diversi, per una migliore parallelizzazione se stai scaricando un sacco di essi sulla stessa pagina, poiché i browser limiteranno le connessioni simultanee massime allo stesso host.)


3

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

FineUploader gestisce gran parte della GUI, ad esempio avanzamento del caricamento, trascinamento della selezione e upload di più file e così via. Sto usando PaperClip perché voglio archiviare le immagini sui miei server anziché su S3.

Ciò che normalmente facciamo è cercare una soluzione configurabile pronta all'uso, anziché ricreare le cose da zero. Con PaperClip immagazzino le immagini e con una StateMachine faccio conversioni sulle immagini e le inserisco in una categoria in base al nome del file. Avevo la stessa domanda che avevi e questa era la mia migliore soluzione funzionante, ecco perché la condivido.


2
Questa è solo una raccomandazione per un pacchetto esterno per fare il lavoro; l'OP stava chiedendo cosa fanno normalmente gli sviluppatori di Ruby on Rails per archiviare immagini, non una raccomandazione. Anche se questo potrebbe essere un esempio di come funziona un pacchetto, in realtà non risponde alla domanda.
Martijn Pieters,

Vero. Ciò che normalmente facciamo è cercare una soluzione configurabile pronta all'uso, anziché ricreare le cose da zero. Con PaperClip immagazzino le immagini e con una StateMachine faccio conversioni sulle immagini e le inserisco in una categoria in base al nome del file. Avevo la stessa domanda dell'OP, e questa era la mia migliore soluzione di lavoro, ecco perché la condivido ..
JeroenKnoops,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.