2013-07-14 9 views
5

In meiner Rails App verwende ich Carrierwave, um Bilder auf Amazon S3 hochzuladen. Ich möchte auf vorhandene Amazon S3-Bilder verweisen, ohne das Bild erneut hochladen zu müssen. Wenn ich beispielsweise ein vorhandenes Amazon S3-Image unter http://test.s3.amazonaws.com/image/path/0001/image.jpg habe, kann ich den Pfad eines Bildes aktualisieren, um auf dieses Bild zu zeigen? Ich möchte die Option für den Remote-Upload nicht verwenden, da ich nur das exakt gleiche Bild verwenden möchte, das bereits vorhanden ist (aber im Attribut "Pfad" meines Datensatzes speichern).carrierwave: Zeigen Sie auf vorhandenes Bild

in der Konsole habe ich versucht:

image.update_attributes(:path=> "http://test.s3.amazonaws.com/image/path/0001/image.jpg") 

aber nicht das Bild der Pfad außer Kraft zu setzen.

+0

Wie konnten Sie das beheben? – Mohamad

+0

Ich habe nicht einen neuen Datensatz erstellen und nur auf den ursprünglichen Datensatz zeigen. – scientiffic

+0

hi @scientiffic hast du eine Lösung dafür gefunden? Ich bin sehr interessant – medBo

Antwort

0

Ich fand, dass Sie tatsächlich tun können, zum Beispiel, wenn Ihr mount_uploader:path ist, dann gilt:

image.remote_path_url = "http://test.s3.amazonaws.com/image/path/0001/image.jpg" 
image.save 
+0

Danke für Ihre Antwort. Wie ich in meinem ursprünglichen Beitrag erwähnt habe, wollte ich die Datei nicht erneut hochladen, was ich glaube, was du mit remote_path_url machst und speicherst. – scientiffic

+0

Gründe, warum Sie die Datei nicht erneut hochladen möchten? In meinem Fall wird es die vorhandene Datei ersetzen und es ist immer noch schneller, als vom lokalen Rechner hochzuladen. Leider sehe ich keine alternativen Möglichkeiten für Carrierwave, ohne dies zu tun. – shinnyx

+0

Ich fand, dass das erneute Hochladen der Datei für meine Anwendung zu langsam war. Stattdessen erkenne ich nur, ob der neue Datensatz auf ein anderes Bild zeigt und das Bild in der Ansicht ersetzt (und nicht in meiner Datenbank). – scientiffic

2

ich ein bisschen spät, um die Partei bin, aber Sie können wie Active Record raw_write_attribute Methode etwas verwenden:

@ image.raw_write_attribute (: path "http://test.s3.amazonaws.com/image/path/0001/image.jpg")

+0

Soweit ich das beurteilen kann, speichert dies den Wert nicht in der DB, und erlaubt es Ihnen sogar nicht, es mit @ image.save in die DB zu schreiben, weil es für das Modell nichts gibt sparen! – Daniel

3

in Chiming, besser spät als nie! Vorbehalt: Dies ist für Schienen 4, und ich teste gerade auf Gleisen 4.1.

Das ist härter als es sein sollte, denke ich! Der Grund, warum dies für mich absolut entscheidend war, war, dass ich 100MB + MP3-Dateien angehängt habe, die ich aufgrund der CloudFlare-SSL-Einschränkungen (und gesundem Menschenverstand) nicht auf meinem Host empfangen kann. Glücklicherweise unterstützt AWS preauthorized Uploads, und ich bekam carrierwave das Richtige für mich zu tun:

Schritt 1: carrierwave mir zu sagen, wo es eine Datei speichern würde, wenn sie könnte:

m.raw_write_attribute('file','file.mp3'); 
url = m.file.url 
signed = aws_presigned_url(url) 

raw_write_attribute tut nichts speichern, es umgeht carrierwave bei der Einstellung des Wertes. Dadurch verhält sich das Objekt so, als würde es 'file.mp3' aus der Datenbank lesen. Dann können Sie Carrierwave fragen, "wo die Datei lebt". Ich lade dann die Datei direkt vom Client nach S3 hoch. Wenn das erledigt ist, mache ich eine andere API-Aufruf an Rails, die den folgenden Code ausführt:

m.raw_write_attribute('file','file.mp3'); 
m.update_attribute('file','file.mp3'); 

Diese beiden gepaart get um Carrierwave. Das erste macht carrierwave zu der Annahme, dass die 'Datei'-Spalte auf' Datei.mp3 'gesetzt ist, die zweite weist rails ausdrücklich an,' file.mp3 'für die Datenbank beizubehalten. Aufgrund des Anrufs raw_write_attribute ermöglicht Carrierwave die zweite durch nicht geändert.

2

In meinem Fall update_column und update_columns hat super funktioniert:

model.update_columns file_1: 'filename.txt' 

Update-Spalte ist mit Komma:

model.update_column :file_1, 'filename.txt' 

Dies wird keinen Rückruf und setzte Spalte filename.txt laufen.

Wenn ich model.file_1.url mache, bekomme ich die richtige S3 URL.