2013-08-05 9 views
5

Nie używam spinacza ani nośnika danych ani żadnych innych klejnotów do interakcji z usługami Amazon World s3. W rzeczywistości nie używam żadnych modeli, tylko bezpośrednio wchodzę w interakcję z obiektami S3.Pobieranie plików S3 (obiektów) przy użyciu aws-sdk dla ruby ​​w szynach

Może ktoś proszę podać jakiś kod, w jaki sposób, aby bezpośrednio pobrać obiektów (plików) z AWS S3

To jest mój kod do tej pory:

Widok:

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

Odpowiadający Kontroler:

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

download_url_for metody:

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 

muszę być w stanie zapisać pobrany plik na dowolnym do przeglądania non-pretedetermined miejscu na mojej desktop.Id naprawdę docenić pogląd na temat sposobu modyfikacji metody download_url_for do osiągnięcia tego celu .

===================================== Właśnie próbowałem przy użyciu

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

Ale po pobraniu dostaję tylko plik zip z zawartością XML, a nie oryginalny plik (dokument Word w moim przypadku) --- wszelkie przemyślenia na temat modyfikowania tego tak, aby uzyskać rzeczywisty typ pliku i zawartość? Dzięki

======================= Herezje mój kod do przesyłania pliku

Zobacz Kod:

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

działanie kontrolera - create_file działanie

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 

czy ktoś może sugerować, w jaki sposób mogę sprawdzić typ MIME lub zachowania pliku while UPL oading, jeśli jest to kwestia wspomniana przez @Frederick Cheung? dzięki

+0

pliki docx są spakowane pliki XML za kulisami - brzmi jak jesteś chyba nie zachowując typu MIME lub nazwy pliku, gdy plik jest przesłane. –

+0

Zmieniono moją odpowiedź poniżej. – rossta

+0

@Frederick Cheung Ive zaktualizował moje pierwotne pytanie, dołączając również mój kod do przesłania ... czy możesz dać mi znać, w jaki sposób mogę sprawdzić MIME lub nazwę pliku podczas przesyłania? – orange88

Odpowiedz

2

Prawdopodobnie lepiej byłoby zapewnić adres URL, aby użytkownicy mogli pobierać bezpośrednio z S3, zamiast próbować przesyłać strumieniowo plik za pośrednictwem aplikacji Rails.

Aws-SDK zapewnia metodę url_for, aby osiągnąć ten cel: http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#url_for-instance_method. To trwa kilka opcji do wygaśnięcia, bezpieczeństwa, pamięci podręcznej, itp podstawowy przykład:

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

--EDIT--

Aby uzyskać dostęp do metody url_for w widoku, musisz odniesień do obiekty s3.Więc w kontrolerze, chcesz zbierać obiektów z węzłów liściowych, a nie klawiszy:

@root_files = bucket.as_tree.children.select(&:leaf?).collect(&:object) 
Powiązane problemy