我的Rails 3应用程序中有一个奇怪的错误。我使用此代码发送非公开的图像:
image = open(f, "rb") { |io| io.read }
send_data(image, :disposition => 'inline')
我正在使用此代码在管理页面和用户页面中显示图像。如果我使用开发环境,则此代码可以正常工作,并且图像将显示在两个页面上。但是,如果我使用生产环境,则此图像仅显示在管理页面中,而不显示在用户页面中。我可以单击未显示的图像,然后选择“属性”。在图像类型下,我看到:
application/xhtml+xml
但是其他公共图像的类型是JPG图像/ PNG图像或类似的东西。
environemnts之间的区别可能导致图像不起作用以及如何解决这个问题,所以图像将在所有页面上正确显示?
答案 0 :(得分:0)
我有一个明显相似的症状。我知道这是一个老问题,已经解决但我认为我会提供我的情况调查结果,结果证明是另一个原因。
我正在构建一个CSV文件并使用send_file将文件发送到浏览器。在开发过程中它运行良好,在生产中浏览器报告找不到页面。
以下是来自控制器的动作。
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又是朋友。我只需要重构此代码,因为它没有显式取消链接创建的临时文件。最佳做法是明确取消链接临时文件。