2013-08-05 4 views
5

amazon Webサービスs3とのやり取りにクリップや搬送波その他の宝石を使用していません。実際、S3オブジェクトと直接対話するだけで、どのモデルも使用していません。ruby​​ for railsのaws-sdkを使ってS3ファイル(オブジェクト)をダウンロードする

ビュー:対応

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

誰かが直接これは、これまでの私のコードであるAWS S3

からオブジェクト(ファイル)をダウンロードする方法のようにいくつかのコードを提供していただけますコントローラ:

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

:私は本当にこれを達成するためにdownload_url_for方法を変更する方法についての見解を感謝し、私のdesktop.Id上の任意の閲覧可能な非pretedetermined場所にダウンロードしたファイルを保存できるようにする必要があり

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 

===================================== 私はちょうど

<td><%= link_to "Download",object.value.url_for(:read).to_s %></td> 
を使用してみました

ダウンロードでは、元のファイル(私の場合は文書)ではなく、実際にファイルの種類と内容を取得するためにこれを変更する方法についての考えはありますか?おかげ

=======================ファイル

ビューコードアップロードするためのHERESに私のコード:

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

コントローラのアクション - CREATE_FILEアクション

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 

は、誰かが私はMIMEタイプをチェックしたり、UPLながらファイル名を保存することができますどのようにとお勧めできます@Frederick Cheungが述べたような問題があるのであれば、ありがとう

+0

のdocxファイルは舞台裏zip形式のXMLファイルは、次のとおりです。だからあなたのコントローラでは、あなたはリーフノードではなく、キーからをオブジェクトを収集したいですアップロードされます。 –

+0

下の自分の回答を編集しました。 – rossta

+0

@Frederick Cheung Iveはアップロードコードを含むようにオリジナルの質問を更新しました...アップロード時にMIMEまたはファイル名を確認する方法を教えてください。 – orange88

答えて

2

Railsアプリケーションでファイルをストリーミングするのではなく、S3から直接ダウンロードするためのURLを提供する方がよいでしょう。

aws-sdkは、これを達成するためのurl_forメソッドを提供します: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--

ビューでurl_forメソッドにアクセスするには、への参照が必要になりますs3オブジェクト。あなたはおそらくときに、ファイルのMIMEタイプまたはファイル名を保存していないように聞こえる -

@root_files = bucket.as_tree.children.select(&:leaf?).collect(&:object) 
関連する問題