gpt4 book ai didi

ruby-on-rails - Rails send_data 以字节形式流式传输 PDF,除非路由直接访问

转载 作者:太空宇宙 更新时间:2023-11-03 16:43:58 26 4
gpt4 key购买 nike

我有一个简单的 Rails 应用程序,可以从(私有(private))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
  • 当直接通过 URL 访问路线时,它可以正常显示 PDF。
  • 在新选项卡中打开指向路线的链接时,它会正常显示 PDF。
  • 在同一选项卡中打开链接时,PDF 数据将作为文本流传输到浏览器。

相同的行为发生在 Rails 4 和 5 中。

我可能在这里遗漏了一些令人讨厌的小东西,但是我怎样才能在同一个选项卡中打开行为以正确显示 PDF 而不是将字节流式传输为文本?


更新 1:

send_pdf 被修改为使用 send_file 而不是 send_data 时,Chrome 给出了 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

最佳答案

关于ruby-on-rails - Rails send_data 以字节形式流式传输 PDF,除非路由直接访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38412628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com