gpt4 book ai didi

ruby-on-rails-3 - Rails 3 发送数据问题;生产和开发的区别

转载 作者:行者123 更新时间:2023-12-03 23:37:51 25 4
gpt4 key购买 nike

我的 Rails 3 应用程序中有一个奇怪的错误。我正在使用此代码发送不公开的图像:

image = open(f, "rb") { |io| io.read }
send_data(image, :disposition => 'inline')

我正在使用此代码在管理页面和用户页面中显示图像。如果我使用 development 环境,此代码工作正常并且图像显示在两个页面上。但是如果我使用 production 环境,这个图像只显示在管理页面而不是用户页面。我可以单击未显示的图像,然后选择“属性”。在图像类型下,我看到:

application/xhtml+xml

但是其他公共(public)图像有 JPG 图像/PNG 图像或类似的类型。

环境之间的哪些差异可能导致图像无法工作?我该如何解决这个问题,以便图像能够在所有页面上正确显示?

最佳答案

我有一个明显相似的症状。我知道这是一个老问题并且已经解决了,但我想我会贡献我的情况的调查结果,结果证明这是一个不同的原因。

我正在构建一个 CSV 文件并使用 send_file 将文件发送到浏览器。在开发中它运行良好,在生产中浏览器报告找不到页面。

这是 Controller 的 Action 。

def export
@campaign = LiveEmailCampaign.find params[:id]
@campaign.recipients_csv do |csv_file|
send_file csv_file,
filename: @campaign.name,
type: Mime::CSV
end
end

CSV 是根据模型中的代码构建的。

def recipients_csv
tempfile = Tempfile.new(self.name.downcase.dasherize)
CSV.open tempfile, 'w' do |csv|
recipients.each do |recipient|
csv << [recipient]
end
end
yield tempfile
end

经过几分钟的研究,我确定罪魁祸首是生产服务器上 Apache 中的 XSendFile 指令与用于写入 CSV 数据的临时路径之间的冲突。在我的例子中,XSendFile 仅为应用程序根目录设置,临时文件位于服务器上的/tmp 中。

我没有在服务器级别篡改 XSendFile 配置,而是指示 Tempfile 使用 Rails 应用程序中的 tmp 文件夹。

因此,我将模型方法中对 Tempfile 的调用更改为此

tempfile = Tempfile.new(self.name.downcase.dasherize)

现在,Rails 和 Apache 又是 friend 了。我只需要重构这段代码,因为它没有明确取消链接创建的临时文件。最佳做法是明确取消链接临时文件。

关于ruby-on-rails-3 - Rails 3 发送数据问题;生产和开发的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7869566/

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