3

Erstens, ich bin sehr neu in Rails und Stack Overflow, und derzeit bushwhacking meinen Weg durch die Lernkurve, so entschuldige ich mich, wenn mein Beitrag lächerlich noobish ist. Hier ist mein Problem:Wie lese ich Dateien in Rails (Bilder/Text) von Amazon s3, die manuell hochgeladen wurden?

Ich versuche, ein Blog von Grund auf mit Amazon S3 zu erstellen Ressourcen zu speichern, wie alle Bilder und Texte. Ich brauche keine Benutzer, die Sachen auf die Seite hochladen, also denke ich, dass ich einfach alles manuell auf s3 hochladen kann, indem ich ihre Konsole unter console.aws.amazon.com benutze. Ich versuche, Rails zu codieren, um Ordner aus meinem S3-Bucket zu lesen und dann die Bilder/den Text auf die richtigen Stellen in der Datenbank zu richten. Zum Beispiel könnte ich in s3 einen Ordner namens "Post1" erstellen, dann liest meine Rails-App die URL von allem aus diesem Ordner und zeigt sie auf Post1 in der Datenbank, dann kann ich einfach die Bild-URL oder den Text aufrufen. in der Ansicht und, theoretisch, zeigen Sie es an. Meine Frage ist, wie bekomme ich meine App, s3-Ordner zu lesen?

Ich weiß, ich erfinde das Rad hier wahrscheinlich neu, aber mein Ziel ist auch, Rails zu lernen. Vielen Dank im Voraus. Sie können my project auf GitHub finden.

Mein Blog Modell:

class BlogPost < ActiveRecord::Base 
    has_attached_file :download, 
        :storage => :s3, 
        :s3_credentials => Proc.new{|a| a.instance.s3_credentials } 

    def s3_credentials 
    {:bucket => "S3_BUCKET_NAME", :access_key_id => "AWS_ACCESS_KEY_ID", :secret_access_key => "AWS_SECRET_ACCESS_KEY"} 
    end 

end 

Hier ist mein Blog-Controller:

class BlogController < ApplicationController 
    before_action :load_posts 


     def index #this method puts all the stuff pulled from 'load_posts' and packages it nicely in a instanced variable 
    @blogPosts = BlogPost.all 
    end 

    def load_posts #this method should pull posts from AWS s3 and add them to the database (like magic) 

    end 

end 

Ich bin sicher, es gibt klaffende Löcher in meinem Code ... wie etwas tatsächlich zu s3 zu sprechen. Ich weiß, dass der Großteil dessen, was ich tun möchte, wahrscheinlich in mein Modell passt. Ich fühle mich wirklich fest. Ich hoffe, dass es eine einfache, magische Ruby-Methode gibt, die ich verwenden kann, wie zum Beispiel s3.file.read oder so. Eine andere Möglichkeit wäre, ein Formular für mich selbst zu erstellen, als wäre ich ein Benutzer, der alles in der Datenbank verbindet und dann auf s3 hochlädt. Dennoch habe ich Leute gelesen, die auf Probleme stoßen, wie zum Beispiel das Timing von Dynos, wenn sie versuchen, große Dateien (wie große Bilder) durch heroku auf s3 hochzuladen. Ich habe Tutorials gelesen, wie man direkt auf s3 hochlädt, aber ich könnte diesen Prozess auch überspringen und einfach auf die Schaltfläche "upload" auf der s3-Konsole klicken. Alles wird helfen. Danke nochmal allen.

Antwort

1

Sie verwenden die AWS-SDK, gut, ich werde Sie mit der Entsprechung s3.file.read dann treffen: Aws::S3::Object#get.

# create your bucket first 
s3_file = bucket.object['myfile.txt'].get({response_target: '/tmp/myfile.txt'}) 

Ich denke, Sie können dann tun s3_file.body.

Zuletzt erfinden Sie das Rad neu und sollten auschecken carrierwave with aws-sdk.

+0

Ich denke, das ist genau das, was ich suche. Danke vielmals! Ich werde einen Follow-up kommentieren, sobald ich mit dem Kopf dagegen stoße und es zum Laufen bringe oder wenn ich weitere Fragen habe. :) –

+0

Vergessen Sie nicht, die Antwort zu akzeptieren, wenn Sie fertig sind. –

+1

Ich versuchte 's3.bucket () .Objekt (" test/my_data.json "). Get ({response_target: '/tmp/data.json'}). Body' und alles, was es antwortete, war' # '... irgendwelche Ideen? – Mirror318