我有一个简单的Rails应用程序,可以从(私有)S3存储桶下载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
在Rails 4和5中也会出现相同的行为。
我可能会遗漏一些令人讨厌的小问题,但是如何在相同的标签行为中打开以正确显示PDF而不是将字节作为文本?
更新1:
Chrome在Failed to load PDF document
被修改为使用send_pdf
而不是send_file
时出现send_data
错误。 (无论链接点击或直接路由请求如何,都会发生此错误。)
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 :(得分:0)
您是否尝试过send_file
代替send_data
?
http://apidock.com/rails/v4.2.1/ActionController/DataStreaming/send_file