我有一個明顯相似的症狀。我知道這是一個老問題,但已經解決了,但我認爲我會爲我的情況做出貢獻,結果卻是不同的原因。
我正在構建一個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.new(self.name.downcase.dasherize)
現在,Rails和Apache的是朋友了。我只需要重構這段代碼,因爲它沒有明確地取消所創建的臨時文件的鏈接。最佳做法是明確取消臨時文件的鏈接。
看看這些文檔,他們提到了很多可能出錯的東西:http://apidock.com/rails/ActionController/DataStreaming/send_file。 –
問題出在應用程序代碼(過濾器之前)的訪問限制,在可能的情況下。一位朋友設法爲我修復:) – nikicc
您可以添加您的修復程序作爲答案,以便其他人可以從您的煩惱中學習:) –