Görüntüleri kaydetmek için Ruby on Rails yolu nedir?


9

Ben geliştirmek iOS ve bir geçiş ediyorum PHP Ruby on Rails arka uç. Değişim biçimi JSON şeklindedir .

'Görüntüleri Rails'e kaydet' için yapılan hızlı bir Google araması, görüntü verilerinin veritabanına blob olarak kaydedilmesinden bahsediyor. Yanılıyor olabilirim, ancak görüntü verilerini bir veritabanına kaydetmenin (dosya konumuna bir bağlantı kaydetmenin aksine ('/img/subcat/4656.png') büyük bir zaman ve alan kaybı olduğu izlenimi altındayım. .

PHP'de, verileri almak, bir dosya adı oluşturmak, bu dosyayı diske kaydetmek ve veritabanını görüntünün diskteki konumuyla güncellemek oldukça standarttır. Bu Ruby on Rails için de geçerli mi, yoksa farkında olmadığım bazı yerleşik ActiveRecord görüntü işlevleri var mı?


1
İstediğime oldukça yakın görünen PaperClip'e rastladım . Binlerce görüntünün optimum hızda sunulması ve alınmasıyla nasıl başa çıkılacağı konusunda deneyimli Rails halkından gelen tavsiyeleri hala takdir ediyorum.
kullanıcı

1
Resmin db veya disk üzerinde fazla yer kaplayacağını biliyorsunuz, değil mi? Bağırsak hissinden, önbellek işlemek için PHP kadar apache'ye dayanmadığından Rails veritabanında depolar diyebilirim. Yine de bu tamamen yanlış olabilir.
Florian Margaine

2
Evet, görüntü verilerinin saklama yeri tarafından değiştirileceğini sanmıyorum. Raylar farklı olabilir, ancak bazı güvenilir SO üyeleri veritabanındaki dosya yollarına yaslanmış gibi görünüyor. Ayrıca, veritabanlarının ölçeklendirilmesinin zor olduğu geleneksel bir bilgi olduğunu düşünüyorum - bu nedenle tonlarca görüntü verisinin veritabanında depolanması kesinlikle bunu daha kolay hale getirmeyecektir.
kullanıcı

Yanıtlar:


4

Geçmişte yaptığım şey, daha hızlı teslimat için Amazon S3 ve CloudFront CDN ile PaperClip kullanmak . PaperClip, S3 depolamayı kutudan çıkar çıkmaz çok güzel bir şekilde destekler: S3 depolama yapılandırma seçenekleri için belgelerine bakın .

  1. Görüntü isteklerini S3 grubunuza ve diğer statik varlık isteklerini Ruby on Rails uygulamanıza iletmek için bir CloudFront dağıtımı ayarlayın (alternatif olarak, bunları S3'e de yükleyebilirsiniz, ancak bu sorunun kapsamı dışındadır).
  2. CloudFront dağıtımınıza işaret etmek üzere kontrol ettiğiniz bir alanı (varlıklar.example.com gibi) CNAME .
  3. PaperClip yapılandırmasında ayarlayın s3_host_alias: assets.example.com. Bu, oluşturulan URL'lerin CloudFront dağıtım ana makinenizi kullanması için kaydedilmiş resim kaynaklarına neden olmasına neden olur .
  4. Ruby on Rails yapılandırmanızda bunu yapabilirsiniz config.action_controller.asset_host = http://assets.example.com. Ruby on Rails varlık URL'leri, önbellekleme / daha hızlı teslimat için CloudFront dağıtımınızı da kullanır.

Bu oldukça kabataslak, ama umarım bazı yararlı kaynaklar yönünde sizi yönlendirir. Tabii ki, bu sadece bir çözüm, ama veritabanında yüz binlerce görüntü eki ile uğraştığım bir durumda benim için çalışan bir çözüm.

(Gerekli veya dava için yararlı olmayabilir olası bir ileri adım olarak, aynı zamanda gibi sizin CloudFront dağıtımı için birden CNAME'ler kurabilirsiniz assets0.example.comve assets1.example.com. Hem ataş s3_host_aliasve action_controller.asset_hostardından deterministically (dayalı sağlayacak lambdas alabilir varlık), tarayıcılar aynı ana bilgisayara maksimum eşzamanlı bağlantıyı sınırlayacağından, aynı sayfada bir demet indiriyorsanız daha iyi paralelleştirme için farklı ana makineler kullanan URL'ler oluşturun.)


3

Birkaç mücevher denedim, ancak şimdi FineUploader'ı PaperClip ile birlikte kullanıyorum

FineUploader, yükleme ilerleme durumu, sürükle ve bırak ve çoklu dosya yüklemeleri gibi birçok GUI'yi sizin için işler. Görüntüleri S3 yerine sunucularımda saklamak istediğim için PaperClip kullanıyorum.

Normalde yaptığımız şey, sıfırdan bir şeyleri yeniden oluşturmak yerine, kutudan çıkar çıkmaz yapılandırılabilir bir çözüm aramaktır. PaperClip ile görüntüleri saklıyorum ve bir StateMachine ile görüntüler üzerinde dönüşümler yapıyorum ve dosya adına göre bir kategoriye yerleştiriyorum. Aynı soruya sahiptim ve bu benim en iyi çalışma çözümümdü, bu yüzden paylaşıyorum.


2
Bu sadece harici bir paketin işi yapması için bir öneridir; OP, Ruby on Rails geliştiricilerinin normalde görüntüleri saklamak için ne yaptığını soruyordu, bir öneri için değil. Bu, bir paketin bunu nasıl yaptığının bir örneği olsa da, bu soruya gerçekten cevap vermiyor.
Martijn Pieters

Doğru. Normalde yaptığımız şey, sıfırdan bir şeyleri yeniden oluşturmak yerine, kutudan çıkar çıkmaz yapılandırılabilir bir çözüm aramaktır. PaperClip ile görüntüleri saklıyorum ve bir StateMachine ile görüntüler üzerinde dönüşümler yapıyorum ve dosya adına göre bir kategoriye yerleştiriyorum. Ben OP aynı soru vardı ve bu benim en iyi çalışma çözüm oldu, bu yüzden paylaşıyorum ..
JeroenKnoops
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.