Ruby on Rails เป็นวิธีการบันทึกภาพอย่างไร


9

ฉันพัฒนาบนiOSและฉันเปลี่ยนจากแบ็กเอนด์PHPเป็น Ruby on Rails รูปแบบการแลกเปลี่ยนเป็นJSON

การค้นหาอย่างรวดเร็วของ Google สำหรับ 'บันทึกภาพในราง' มีเกือบทุกผลลัพธ์ที่พูดคุยเกี่ยวกับการบันทึกข้อมูลภาพเป็น blobs ไปยังฐานข้อมูล ฉันอาจเข้าใจผิด แต่ฉันรู้สึกว่าการบันทึกข้อมูลภาพในฐานข้อมูลเป็นการสูญเสียเวลาและพื้นที่อย่างมาก (ซึ่งต่างจากการบันทึกลิงก์ไปยังตำแหน่งไฟล์ ('/img/subcat/4656.png') .

ใน PHP เป็นมาตรฐานที่ค่อนข้างดีในการรับข้อมูลสร้างชื่อไฟล์บันทึกไฟล์นั้นลงดิสก์และอัปเดตฐานข้อมูลด้วยตำแหน่งของรูปภาพบนดิสก์ นี่เป็นสิ่งเดียวกันสำหรับ Ruby on Rails หรือว่ามีฟังก์ชั่นภาพ ActiveRecord ในตัวที่ฉันไม่ทราบ?


1
ฉันสะดุดเข้ากับคลิปหนีบกระดาษซึ่งดูเหมือนจะใกล้เคียงกับสิ่งที่ฉันต้องการ ยังคงขอขอบคุณคำแนะนำจากชาว Rails ที่มีประสบการณ์เกี่ยวกับวิธีการจัดการกับการให้บริการและการรับภาพหลายพันภาพด้วยความเร็วสูงสุด
ผู้ใช้

1
คุณรู้หรือไม่ว่าภาพจะใช้พื้นที่มากพอ ๆ กับ db หรือบนดิสก์ใช่ไหม? จากความรู้สึกของลำไส้ฉันจะบอกว่า Rails เก็บอยู่ในฐานข้อมูลเพราะมันไม่ได้พึ่งพา Apache มากเท่ากับ PHP ในการจัดการแคช นั่นอาจผิดอย่างสมบูรณ์แม้ว่า
Florian Margaine

2
ใช่ฉันไม่คิดว่าข้อมูลภาพจะถูกจัดการโดยที่เก็บสินค้า Rails อาจแตกต่างกัน แต่สมาชิก SO ที่น่าเชื่อถือบางรายดูเหมือนจะเอนไปทางพา ธ ไฟล์ในฐานข้อมูล นอกจากนี้ฉันคิดว่าเป็นความรู้ทั่วไปที่ฐานข้อมูลยากต่อการปรับขนาดดังนั้นการจัดเก็บข้อมูลภาพจำนวนมากในฐานข้อมูลจะไม่ทำให้ง่ายขึ้น
ผู้ใช้

คำตอบ:


4

สิ่งที่ฉันทำในอดีตคือใช้ PaperClip กับAmazon S3และCloudFront CDNเพื่อการส่งที่รวดเร็วขึ้น คลิปหนีบกระดาษรองรับการจัดเก็บ S3 อย่างมากออกจากกล่อง: ดูเอกสารของพวกเขาสำหรับการตั้งค่าตัวเลือกการจัดเก็บ S3

  1. ตั้งค่าการกระจาย CloudFront เพื่อส่งต่อคำขอภาพไปยังที่ฝากข้อมูล S3 ของคุณและคำขออื่น ๆ สำหรับเนื้อหาแบบคงที่ไปยังแอปพลิเคชั่น Ruby on Rails ของคุณ (หรือคุณสามารถอัปโหลดภาพเหล่านั้นไปยัง S3 ได้เช่นกัน
  2. CNAMEโดเมนที่คุณควบคุม (เช่น assets.example.com) ให้ชี้ไปที่การกระจาย CloudFront ของคุณ
  3. s3_host_alias: assets.example.comในการกำหนดค่าคลิปชุด สิ่งนี้จะทำให้URL ที่สร้างขึ้นไปยังทรัพยากรรูปภาพที่บันทึกไว้ใช้โฮสต์การกระจาย CloudFront ของคุณ
  4. ใน Ruby on Rails config.action_controller.asset_host = http://assets.example.comการกำหนดค่าของคุณแล้วคุณสามารถทำ URL สินทรัพย์ Ruby on Rails จะใช้การจัดจำหน่าย CloudFront ของคุณเพื่อการส่งแคช / เร็วขึ้น

นั่นเป็นภาพร่างที่ค่อนข้างสมบูรณ์ แต่หวังว่าจะนำคุณไปสู่แหล่งข้อมูลที่เป็นประโยชน์ แน่นอนว่าเป็นเพียงทางออกเดียว แต่เป็นวิธีที่ได้ผลสำหรับฉันในสถานการณ์ที่ฉันต้องเผชิญกับสิ่งที่แนบมากับภาพนับแสนในฐานข้อมูล

(เป็นขั้นตอนขั้นสูงที่อาจไม่จำเป็นหรือมีประโยชน์สำหรับกรณีของคุณคุณยังสามารถตั้งค่า CNAME หลายรายการสำหรับการจัดจำหน่าย CloudFront ของคุณเช่นassets0.example.comและassets1.example.com. คลิปหนีบกระดาษทั้งสองs3_host_aliasและaction_controller.asset_hostจากนั้นสามารถนำลูกแกะที่จะช่วยให้คุณกำหนดค่าได้ asset) สร้าง URL ที่ใช้โฮสต์ที่แตกต่างกันเพื่อการขนานที่ดียิ่งขึ้นหากคุณดาวน์โหลดเครือข่ายเหล่านั้นในหน้าเดียวกันเนื่องจากเบราว์เซอร์จะ จำกัด การเชื่อมต่อสูงสุดพร้อมกันกับโฮสต์เดียวกัน)


3

ฉันลองใช้หลายพลอยแล้ว แต่ตอนนี้ฉันใช้FineUploaderร่วมกับPaperClip

FineUploader จัดการ GUI จำนวนมากสำหรับคุณเช่นความคืบหน้าในการอัปโหลดการลากและวางและการอัปโหลดไฟล์หลายไฟล์และอื่น ๆ ฉันใช้ PaperClip เพราะฉันต้องการจัดเก็บภาพบนเซิร์ฟเวอร์ของฉันแทนที่จะเป็น S3

สิ่งที่เราทำตามปกติคือมองหาโซลูชันที่กำหนดค่าได้อย่างเสถียรแทนที่จะเป็นของที่สร้างขึ้นใหม่จากศูนย์ ด้วย PaperClip ฉันเก็บภาพและด้วย StateMachine ฉันจะแปลงภาพและทำให้พวกเขาเป็นหมวดหมู่ตามชื่อไฟล์ ฉันมีคำถามแบบเดียวกันกับที่คุณมีและนี่เป็นวิธีแก้ปัญหาการทำงานที่ดีที่สุดของฉันนั่นคือเหตุผลที่ฉันแบ่งปัน


2
นี่เป็นเพียงข้อเสนอแนะสำหรับแพ็กเกจภายนอกเพื่อใช้งาน OP ได้ขอสิ่งที่ Ruby on Rails ทำตามปกติเพื่อจัดเก็บภาพไม่ใช่เพื่อการแนะนำ ในขณะที่นี่อาจเป็นตัวอย่างของวิธีการหนึ่งแพคเกจมันไม่ตอบคำถาม
Martijn Pieters

จริง สิ่งที่เราทำตามปกติคือมองหาโซลูชันที่กำหนดค่าได้อย่างเสถียรแทนที่จะเป็นของที่สร้างขึ้นใหม่จากศูนย์ ด้วย PaperClip ฉันเก็บภาพและ StateMachine ฉันจะแปลงภาพและทำให้พวกเขาเป็นหมวดหมู่ตามชื่อไฟล์ ฉันมีคำถามเดียวกันกับ OP และนี่เป็นวิธีแก้ปัญหาการทำงานที่ดีที่สุดของฉันนั่นคือเหตุผลที่ฉันแชร์มัน ..
JeroenKnoops
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.