2013-08-05 6 views
5

Ich verwende keine Büroklammer oder Carrierwave oder andere Edelsteine ​​für die Interaktion mit Amazon Web Services s3. Tatsächlich verwende ich keine Modelle, nur direkt mit S3-Objekten interagieren.Herunterladen von S3-Dateien (Objekte) mit aws-sdk für Ruby in Schienen

Kann jemand geben Sie bitte einen Code, wie direkt Objekte (Dateien) von AWS S3

Das ist mein Code zum Download ist so weit:

Ausblick:

<h2>Download Files</h2> 
<%@root_files.each do |file| %> 
<% next if @obj %>   
<td>Filename: <b><%= file %></b></td> 
<td><%= link_to "Download", download_url_for(file) %></td> 
<% end %> 

Entsprechende Steuerung:

def xxx 
bucket = AWS::S3.new.buckets[ ENV["BUCKET"]] 
@root_files = bucket.as_tree.children.select(&:leaf?).collect(&:key) 
end 

download_url_for Methode:

def download_url_for(file_key) 
    s3 = AWS::S3.new 
    bucket = s3.buckets[ ENV["BUCKET"]] 
    object = bucket.objects[file_key] 
    File.open('xxxxx', 'wb') do |file| 
    object.read do |chunk| 
     file.write(chunk) 
    end 
    end 
end 

Ich muss in der Lage, die heruntergeladene Datei auf einem beliebigen durchsuchbaren nicht-pretedetermined Lage auf meinem desktop.Id wirklich zu schätzen Ansicht zu speichern, wie die download_url_for Methode zu ändern, dies zu erreichen .

===================================== Ich habe gerade versucht

mit
<td><%= link_to "Download",object.value.url_for(:read).to_s %></td> 

Aber beim Herunterladen bekomme ich nur eine ZIP-Datei mit XML-Inhalt, nicht die ursprüngliche Datei (Word-Dokument in meinem Fall) --- irgendwelche Gedanken darüber, wie man dies ändert, um den eigentlichen Dateityp und Inhalt zu bekommen? Dank

======================= Heres mein Code

Ansicht Code, um die Datei für das Hochladen:

<%= form_tag({:action => 'create_file'}, multipart: true) do %> 
<%= file_field_tag 'uploaded_file' %><br /> 
<%= submit_tag 'Upload' %> <br /> 
<% end %> 

Controller-Aktion - CREATE_FILE Aktion

def create_file 
s3 = AWS::S3.new 
bucket = s3.buckets[ENV["BUCKET"]] 
key = params[:uploaded_file].original_filename 
object = bucket.objects[key] 
object.write(params[:uploaded_file].read) 
end 

jemand behaupten kann, wie ich den MIME-Typ überprüfen oder den Dateinamen während upl bewahren wenn das Problem von @Frederick Cheung angesprochen wird? danke

+0

docx-Dateien sind gezippte XML-Dateien hinter den Kulissen - klingt wie Sie vielleicht nicht MIME-Typen erhalten oder Dateinamen, wenn die Datei ist hochgeladen. –

+0

Bearbeitete meine Antwort unten. – rossta

+0

@Frederick Cheung Ich habe meine ursprüngliche Frage aktualisiert, um auch meinen Upload-Code einzuschließen ... kannst du mir bitte mitteilen, wie ich den MIME oder Dateinamen beim Hochladen überprüfen kann? – orange88

Antwort

2

Sie wären wahrscheinlich besser dran, wenn Sie Benutzern eine URL direkt von S3 herunterladen, anstatt zu versuchen, die Datei über Ihre Rails App zu streamen.

Die aws-sdk bietet die url_for Methode, um dies zu erreichen: http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#url_for-instance_method. Es dauert eine Reihe von Optionen für den Verfall, Sicherheit, Caching, usw. Ein einfaches Beispiel:

<td><%= link_to "Download", file.url_for(:read) %></td> 

--EDIT--

Um die url_for Methode in der Ansicht zu gelangen, werden Sie für Referenzen zu die s3 Objekte.Also in Ihrem Controller, mögen Sie Objekte von dem Blattknoten sammeln, keine Schlüssel:

@root_files = bucket.as_tree.children.select(&:leaf?).collect(&:object) 
Verwandte Themen