2016-07-16 3 views
2

私は(プライベート)S3バケットからPDFをダウンロードしてブラウザに提供する簡単なRailsアプリケーションを持っています。Rails send_dataストリーミングPDFをバイト単位でストリームに直接アクセスしない限り

# app/controllers/file_controller.rb 
class FileController < ApplicationController 
    def send_pdf 
    s3_file = Aws::S3::Resource.new(
     region: "us-east-1", 
     access_key_id: S3_ACCESS_KEY_ID, 
     secret_access_key: S3_SECRET_ACCESS_KEY 
    ).bucket('bucket-name').objects({prefix: "file_name"}).first.get.body.string 

    send_data s3_file, filename: "FileName.pdf", type: 'application/pdf', disposition: 'inline' 
    end 
end 


# config/routes.rb 
Rails.application.routes.draw do 
    get 'file', to: 'file#send_pdf', defaults: { format: 'pdf' } 
end 
  • URL経由で直接ルートにアクセスして、それはPDFの罰金を表示します。
  • 新しいタブでルートへのリンクを開くと、PDFが正しく表示されます。
  • 同じタブでリンクを開くと、代わりにPDFデータがテキストとしてブラウザに送信されます。

同じ動作がレール4に発生し、5

は、私はおそらくここにうるさくマイナーな何かが欠けていますが、どのように私は適切にストリーミングするのではなく、PDFを表示するには、同じタブの挙動でオープンを得ることができますテキストとしてのバイト?


アップデート1:send_pdfsend_filesend_dataの代わりに使用するように変更された場合

クロムFailed to load PDF document誤差を与えます。 (このエラーは関係なく、リンクのクリックまたは直接ルート要求の発生します。)

def send_pdf 

    # S3 download 

    temp_file = "#{Rails.root}/tmp/file.pdf" 

    File.open(temp_file,"wb") do |f| 
    f.write(s3_file) 
    f.close 
    end 

    send_file temp_file, filename: "FileName.pdf", type: 'application/pdf', disposition: 'inline' 

    File.delete(temp_file) 
end 
+0

この解決策を思いついたことがありますか?私は同じ問題を抱えています –

答えて

関連する問題