2013-08-05 14 views
5

Amazon web hizmetleri s3 ile etkileşim için ataç veya carrierwave veya diğer taşlar kullanmıyorum. Aslında, sadece doğrudan S3 nesnelerle etkileşime giren herhangi bir model kullanmıyorum.S3 dosyalarını (nesneler) raylardaki yakut için aws-sdk kullanarak indirme

Görünüm:

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

Sorumlu

birisi

Bu benim defa kodudur doğrudan AWS S3 nesneler (dosya) indirmek için nasıl bazı kod verir misiniz Denetleyici:

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

:

Gerçekten bunu başarmak için download_url_for yöntemini değiştirme konusunda görünümü takdir benim desktop.Id üzerinde hiçbir göz atılabilir olmayan pretedetermined yere indirilen dosyayı kaydetmek gerekiyor
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 

.

===================================== Sadece

<td><%= link_to "Download",object.value.url_for(:read).to_s %></td> 
kullanarak çalıştı

Ama indirimde sadece içinde xml içeriği olan bir zip dosyası alıyorum, orijinal dosya (benim durumumdaki kelime belgesi) --- gerçek dosya türünü ve içeriğini elde etmek için nasıl değiştirileceğine dair herhangi bir düşünce var mı? Teşekkür

======================= dosyayı

Görünüm kodu yüklemek için İşte benim kod:

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

Kontrolör eylemi - create_file eylem

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 

birisi MIME türünü kontrol etmek veya UPL ise dosya adını korumak nasıl olarak önerebilir @Frederick Cheung tarafından belirtildiği gibi bu sorun çıkarsa? teşekkürler

+0

docx dosyaları perde arkasında sıkıştırılmış xml dosyalarıdır: Yani denetleyicisi, sen yaprak düğümler değil tuşlar gelennesneleri toplamak istiyorum yüklendi. –

+0

Yanıtımı aşağıda düzenledi. – rossta

+0

@Frederick Cheung Orijinal sorumu, yükleme kodumu da eklemek üzere güncelledim ... yükleme sırasında MIME veya dosya adını nasıl kontrol edebileceğimi lütfen bana bildirir misiniz? – orange88

cevap

2

Rails uygulamanız aracılığıyla dosyayı akışa almak yerine, kullanıcıların doğrudan S3'ten indirmeleri için bir URL sağlamanız daha iyi olacaktır.

aws-sdk, bunu gerçekleştirmek için url_for yöntemini sağlar: http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#url_for-instance_method.

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

--EDIT--

sen başvurular gerekir, görünümde url_for yöntemini erişmek için: Bu son kullanma, güvenlik, önbelleğe alma, vb Temel bir örnek için seçenekler bir demet alır s3 nesneleri.belki zaman dosya MIME türü veya dosya adını koruyarak değil gibi geliyor -

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