You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails应用中PDF触发下载而非在线显示的问题排查

问题解决思路及方案

1. 确保Faraday正确获取二进制数据

Faraday默认会尝试解析响应内容,如果第三方API返回的是二进制PDF,必须让Faraday返回原始二进制数据,避免被错误解析为文本。检查你的client.document方法,确保添加response :raw配置:

# 示例Faraday客户端配置
def client
  Faraday.new(url: '第三方API地址') do |faraday|
    faraday.response :raw  # 关键配置:保留原始二进制响应
    faraday.adapter Faraday.default_adapter
  end
end

def document(id)
  response = client.get("/documents/#{id}")
  response.body  # 直接返回原始二进制内容
end

2. 强制覆盖响应头,排除第三方API的头干扰

如果第三方API返回的响应头中包含Content-Disposition: attachment,会直接覆盖你设置的inline规则。需要在send_data前手动清除或覆盖响应头:

def document
  file = client.document(params[:id])

  # 清除第三方API返回的可能干扰的响应头
  response.headers.delete('Content-Disposition')
  # 发送数据并明确配置
  send_data(file, 
            disposition: 'inline', 
            type: 'application/pdf',
            filename: "document_#{params[:id]}.pdf")  # 可选:明确文件名帮助浏览器识别类型
end

3. 验证前端访问方式

部分场景下,前端的访问方式会影响PDF的展示行为:

  • 避免使用带有download属性的<a>标签,这会强制触发下载
  • 推荐用<iframe>直接嵌入该控制器接口的URL,示例视图代码:
<iframe src="<%= document_path(id: @doc.id) %>" width="100%" height="600px"></iframe>

内容的提问来源于stack exchange,提问作者mr_muscle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:45:33