私は(プライベート)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_pdf
はsend_file
send_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
この解決策を思いついたことがありますか?私は同じ問題を抱えています –