Rails使用wicked_pdf生成PDF在PDF阅读器中文件名错误如何解决?
问题原因
这个问题是因为默认配置下,Rails返回PDF时没有在HTTP响应头的Content-Disposition字段明确指定文件名,非Chrome预览场景(比如直接用PDF阅读器打开、第三方下载工具下载)会优先读取请求URL路径中的文件名(也就是download.pdf),只有Chrome内置预览逻辑会读取render方法传入的pdf参数作为文件名,所以才会出现两种场景文件名不一致的问题。
可行解决方案(无需修改路由)
方案1:直接在render参数中指定文件名和展示方式
常用的Rails PDF渲染组件(如wicked_pdf)支持直接在render时传入disposition和filename参数,修改代码如下:
format.pdf do render pdf: "#{@sale.firstname}#{@sale.lastname}", dpi: 400, # 保持inline模式允许浏览器预览,不会强制触发下载 disposition: 'inline', # 明确指定完整文件名,框架会自动写入响应头 filename: "#{@sale.firstname}#{@sale.lastname}.pdf" end
方案2:手动设置响应头(兼容所有版本)
如果使用的组件版本较低不支持上述参数,可以手动配置响应头,优先级最高:
format.pdf do target_filename = "#{@sale.firstname}#{@sale.lastname}.pdf" # 手动设置Content-Disposition响应头,所有客户端都会优先读取该文件名 response.headers['Content-Disposition'] = "inline; filename=\"#{target_filename}\"" render pdf: target_filename.delete_suffix('.pdf'), dpi: 400 end
修改后无需调整路由,所有场景下都会使用你配置的自定义文件名,不会再出现固定为download.pdf的问题。
内容的提问来源于stack exchange,提问作者almo
相关产品推荐
相关产品推荐

