Apa itu cara Ruby on Rails untuk menyimpan gambar?

9

Saya mengembangkan di iOS , dan saya beralih dari backend PHP ke Ruby on Rails. Format pertukaran adalah JSON .

Pencarian Google cepat untuk 'menyimpan gambar di Rails' memiliki hampir setiap hasil berbicara tentang menyimpan data gambar sebagai gumpalan ke database. Saya mungkin salah, tetapi saya mendapat kesan bahwa menyimpan data gambar dalam database adalah pemborosan waktu dan ruang yang sangat besar (dibandingkan dengan menyimpan tautan ke lokasi file ('/img/subcat/4656.png') .

Di PHP, cukup standar untuk menerima data, menghasilkan nama file, menyimpan file itu ke disk, dan memperbarui database dengan lokasi gambar pada disk. Apakah ini sama dengan Ruby on Rails, atau ada beberapa fungsi gambar ActiveRecord bawaan yang tidak saya sadari?

pengguna
sumber
1
Saya menemukan PaperClip , yang sepertinya cukup dekat dengan yang saya inginkan. Akan sangat menghargai saran dari orang-orang Rails yang berpengalaman tentang cara menangani melayani dan menerima ribuan gambar dengan kecepatan optimal.
pengguna
1
Anda tahu bahwa gambar akan mengambil banyak ruang pada db atau pada disk, bukan? Dari firasat, saya akan mengatakan Rails menyimpan di database karena tidak bergantung pada apache sebanyak PHP untuk menangani caching. Itu mungkin benar-benar salah.
Florian Margaine
2
Ya, saya tidak berpikir data gambar akan dimanipulasi oleh lokasi penyimpanan. Rails mungkin berbeda, tetapi beberapa anggota SO yang dapat dipercaya tampaknya condong ke jalur file dalam database. Plus, saya pikir ini pengetahuan konvensional bahwa basis data sulit untuk diukur - jadi menyimpan berton-ton data gambar dalam basis data pasti tidak akan membuatnya lebih mudah.
pengguna

Jawaban:

4

Apa yang saya lakukan di masa lalu adalah menggunakan PaperClip dengan Amazon S3 dan CloudFront CDN untuk pengiriman yang lebih cepat. PaperClip mendukung penyimpanan S3 dengan sangat baik di luar kotak: lihat dokumentasi mereka untuk opsi konfigurasi penyimpanan S3 .

  1. Siapkan distribusi CloudFront untuk meneruskan permintaan gambar ke bucket S3 Anda dan permintaan lainnya untuk aset statis ke aplikasi Ruby on Rails Anda (atau Anda juga dapat mengunggahnya ke S3, tapi itu di luar ruang lingkup pertanyaan ini).
  2. CNAME domain yang Anda kontrol (seperti assets.example.com) untuk mengarah ke distribusi CloudFront Anda.
  3. Dalam konfigurasi PaperClip, atur s3_host_alias: assets.example.com. Ini akan menyebabkan URL yang dihasilkan ke sumber daya gambar yang disimpan untuk menggunakan host distribusi CloudFront Anda.
  4. Dalam konfigurasi Ruby on Rails Anda, Anda dapat melakukannya config.action_controller.asset_host = http://assets.example.com. URL aset Ruby on Rails kemudian juga akan menggunakan distribusi CloudFront Anda, untuk caching / pengiriman yang lebih cepat.

Itu cukup samar, tetapi mudah-mudahan itu menunjukkan Anda ke arah beberapa sumber daya yang berguna. Tentu saja, itu hanya satu solusi, tetapi itu salah satu yang telah bekerja untuk saya dalam situasi di mana saya berurusan dengan ratusan ribu lampiran gambar dalam database.

(Sebagai langkah lanjutan yang mungkin tidak diperlukan atau berguna untuk kasus Anda, Anda juga dapat mengatur beberapa CNAME untuk distribusi CloudFront Anda, seperti assets0.example.comdan assets1.example.com. Keduanya penjepit kertas s3_host_aliasdan action_controller.asset_hostkemudian dapat mengambil lambda yang akan memungkinkan Anda untuk secara deterministik (berdasarkan pada aset) menghasilkan URL yang menggunakan host yang berbeda, untuk paralelisasi yang lebih baik jika Anda mengunduh banyak dari mereka di halaman yang sama, karena browser akan membatasi koneksi simultan maksimum ke host yang sama.)

gregates
sumber
3

Saya sudah mencoba beberapa permata, tetapi sekarang saya menggunakan FineUploader bersama dengan PaperClip

FineUploader menangani banyak GUI untuk Anda, misalnya kemajuan unggahan, seret-dan-jatuhkan dan beberapa unggahan file, dan sebagainya. Saya menggunakan PaperClip karena saya ingin menyimpan gambar di server saya bukan di S3.

Apa yang biasanya kita lakukan adalah mencari solusi yang dapat dikonfigurasikan out-of-the-box yang stabil alih-alih menciptakan kembali barang-barang dari awal. Dengan PaperClip saya menyimpan gambar dan dengan StateMachine saya melakukan konversi pada gambar dan memasukkannya ke dalam kategori berdasarkan nama file. Saya memiliki pertanyaan yang sama dengan yang Anda miliki, dan ini adalah solusi kerja terbaik saya, itulah mengapa saya membagikannya.

JeroenKnoops
sumber
2
Ini hanya rekomendasi untuk paket eksternal untuk melakukan pekerjaan; OP menanyakan apa yang biasanya dilakukan Ruby on Rails untuk menyimpan gambar, bukan untuk rekomendasi. Meskipun ini bisa menjadi contoh bagaimana satu paket melakukannya, ini tidak benar-benar menjawab pertanyaan.
Martijn Pieters
Benar. Apa yang biasanya kita lakukan adalah mencari solusi yang dapat dikonfigurasikan out-of-the-box yang stabil alih-alih menciptakan kembali barang-barang dari awal. Dengan PaperClip saya menyimpan gambar dan dengan StateMachine saya melakukan konversi pada gambar dan memasukkannya ke dalam kategori berdasarkan nama file. Saya memiliki pertanyaan yang sama dengan OP, dan ini adalah solusi kerja terbaik saya, itulah mengapa saya membagikannya ..
JeroenKnoops