2013-08-05 31 views
5

Non utilizzo paperclip o carrierwave o altre gemme per l'interazione con i servizi Web di Amazon s3. In effetti, non sto usando alcun modello, solo interagendo direttamente con oggetti S3.Download di file S3 (oggetti) utilizzando aws-sdk per ruby ​​in rotaie

Qualcuno può fornire qualche codice su come scaricare direttamente oggetti (file) da AWS S3

Questo è il mio codice finora:

Vista:

<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 %> 

Corrispondente Controller:

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

download_url_for metodo:

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 

ho bisogno di essere in grado di salvare il file scaricato su qualsiasi posizione sfogliabile non pretedetermined sulla mia desktop.Id davvero apprezzare vista su come modificare il metodo download_url_for per raggiungere questo obiettivo .

===================================== ho appena provato ad utilizzare

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

Ma al momento del download ottengo solo un file zip con contenuto xml al suo interno, non il file originale (documento word nel mio caso) --- qualche idea su come modificare questo in modo da ottenere il tipo e il contenuto del file effettivo? Grazie

======================= Heres il mio codice per caricare il file

Vista Codice:

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

azione di controllo - CREATE_FILE azione

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 

qualcuno può suggerire quanto a come posso controllare il tipo MIME o preservare il nome del file, mentre UPL oading se questo è il problema menzionato da @Frederick Cheung? grazie

+0

file docx sono file XML zip dietro le quinte - Sembra che si sta forse non conservando tipo MIME o nome del file quando il file è caricato. –

+0

Modificato la mia risposta qui sotto. – rossta

+0

@Frederick Cheung Ive ha aggiornato la mia domanda originale per includere anche il mio codice di caricamento ... può farmi sapere come posso verificare il MIME o il nome file durante il caricamento? – orange88

risposta

2

Probabilmente staresti meglio fornendo un URL per gli utenti per scaricare direttamente da S3 piuttosto che provare a trasmettere il file attraverso l'app Rails.

aws-sdk fornisce il metodo url_for per ottenere ciò: http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#url_for-instance_method. Ci vuole un sacco di opzioni per la scadenza, la sicurezza, la memorizzazione nella cache, ecc Un esempio di base:

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

--EDIT--

Per accedere al metodo url_for nella vista, avrete bisogno di riferimenti a gli oggetti s3.Così nel controller, si desidera raccogliere oggetti dai nodi foglia, non chiavi:

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