Was ist eine Ruby on Rails-Methode zum Speichern von Bildern?

9

Ich entwickle unter iOS und wechsle von einem PHP- Backend zu Ruby on Rails. Das Austauschformat ist JSON .

Bei einer schnellen Google-Suche nach "Bilder in Rails speichern" wird fast in jedem Ergebnis davon gesprochen, Bilddaten als Blobs in der Datenbank zu speichern. Ich könnte mich irren, aber ich habe den Eindruck, dass das Speichern von Bilddaten in einer Datenbank eine enorme Zeit- und Platzverschwendung darstellt (im Gegensatz zum Speichern eines Links zum Dateispeicherort ('/img/subcat/4656.png'). .

In PHP ist es ziemlich normal, die Daten zu empfangen, einen Dateinamen zu generieren, diese Datei auf der Festplatte zu speichern und die Datenbank mit dem Speicherort des Bildes auf der Festplatte zu aktualisieren. Ist dies auch bei Ruby on Rails der Fall oder gibt es einige integrierte ActiveRecord-Image-Funktionen, die mir nicht bekannt sind?

Nutzer
quelle
1
Ich bin auf PaperClip gestoßen , das ziemlich nah an dem zu sein scheint, was ich will. Ich würde mich immer noch über Ratschläge von erfahrenen Rails-Leuten freuen, wie man mit dem Servieren und Empfangen von Tausenden von Bildern mit optimaler Geschwindigkeit umgeht.
Benutzer
1
Sie wissen, dass das Image auf der Datenbank oder auf der Festplatte genauso viel Speicherplatz beansprucht, oder? Aus Bauchgefühl würde ich sagen, dass Rails in der Datenbank speichert, da es nicht so sehr auf Apache als auf PHP angewiesen ist, um das Caching zu handhaben. Das könnte aber völlig falsch sein.
Florian Margaine
2
Ja, ich glaube nicht, dass die Bilddaten vom Speicherort manipuliert werden. Rails mögen unterschiedlich sein, aber einige vertrauenswürdige SO-Mitglieder scheinen sich zu Dateipfaden in der Datenbank zu neigen. Außerdem denke ich, dass es allgemein bekannt ist, dass Datenbanken schwer zu skalieren sind. Das Speichern von Tonnen von Bilddaten in der Datenbank wird dies sicherlich nicht einfacher machen.
Benutzer

Antworten:

4

In der Vergangenheit habe ich PaperClip mit Amazon S3 und CloudFront CDN für eine schnellere Lieferung verwendet. PaperClip unterstützt S3-Speicher sofort sehr gut: Informationen zur Konfiguration des S3-Speichers finden Sie in der Dokumentation .

  1. Richten Sie eine CloudFront-Distribution ein, um Bildanforderungen an Ihren S3-Bucket und andere Anforderungen für statische Assets an Ihre Ruby on Rails-Anwendung weiterzuleiten (alternativ können Sie diese auch in S3 hochladen, dies liegt jedoch außerhalb des Bereichs dieser Frage).
  2. CNAME eine Domain, die Sie steuern (z. B. assets.example.com), um auf Ihre CloudFront-Distribution zu verweisen.
  3. Legen Sie in der PaperClip-Konfiguration fest s3_host_alias: assets.example.com. Dadurch werden generierte URLs zu gespeicherten Bildressourcen, um Ihren CloudFront-Distributionshost zu verwenden.
  4. In Ihrer Ruby on Rails-Konfiguration können Sie dies dann tun config.action_controller.asset_host = http://assets.example.com. Ruby on Rails-Asset-URLs verwenden dann auch Ihre CloudFront-Distribution für das Caching / die schnellere Bereitstellung.

Das ist ziemlich lückenhaft, aber es weist Sie hoffentlich in Richtung einiger nützlicher Ressourcen. Natürlich ist das nur eine Lösung, aber es hat für mich in einer Situation funktioniert, in der ich mit Hunderttausenden von Bildanhängen in der Datenbank zu tun hatte.

(Als möglicher fortgeschrittener Schritt, der für Ihren Fall möglicherweise nicht erforderlich oder nützlich ist, können Sie auch mehrere CNAMEs für Ihre CloudFront-Distribution einrichten, z. B. assets0.example.comund assets1.example.com. Beide Büroklammern s3_host_aliasund action_controller.asset_hostdann Lambdas, mit denen Sie deterministisch (basierend auf dem Asset) Generieren Sie URLs, die unterschiedliche Hosts verwenden, um eine bessere Parallelisierung zu erzielen, wenn Sie eine Reihe von Hosts auf derselben Seite herunterladen, da Browser die maximale Anzahl gleichzeitiger Verbindungen zu demselben Host begrenzen.)

Gregate
quelle
3

Ich habe mehrere Edelsteine ​​ausprobiert, aber jetzt verwende ich FineUploader zusammen mit PaperClip

FineUploader verwaltet einen Großteil der GUI für Sie, z. B. den Upload-Fortschritt, das Ziehen und Ablegen sowie das Hochladen mehrerer Dateien usw. Ich verwende PaperClip, weil ich die Bilder auf meinen Servern anstatt auf S3 speichern möchte.

Normalerweise suchen wir nach einer stabilen, sofort einsatzbereiten, konfigurierbaren Lösung, anstatt die Daten von Grund auf neu zu erstellen. Mit PaperClip speichere ich die Bilder und mit einer StateMachine konvertiere ich die Bilder und ordne sie in eine Kategorie ein, die auf dem Dateinamen basiert. Ich hatte die gleiche Frage, die Sie hatten, und dies war meine am besten funktionierende Lösung. Deshalb teile ich sie.

JeroenKnoops
quelle
2
Dies ist nur eine Empfehlung für ein externes Paket, um die Arbeit zu erledigen. Das OP fragte nach dem, was Ruby on Rails-Entwickler normalerweise tun, um Bilder zu speichern, und nicht nach einer Empfehlung. Dies ist zwar ein Beispiel dafür, wie ein Paket dies tut, aber dies beantwortet die Frage nicht wirklich.
Martijn Pieters
Wahr. Normalerweise suchen wir nach einer stabilen, sofort einsatzbereiten, konfigurierbaren Lösung, anstatt die Daten von Grund auf neu zu erstellen. Mit PaperClip speichere ich die Bilder und mit einer StateMachine konvertiere ich die Bilder und ordne sie in eine Kategorie ein, die auf dem Dateinamen basiert. Ich hatte die gleiche Frage, die das OP hatte, und dies war meine beste funktionierende Lösung, deshalb teile ich sie.
JeroenKnoops