3

我的Rails 3應用程序中有一個奇怪的錯誤。我使用這個代碼發送未公開圖片:Rails 3 send_data問題;生產和開發之間的差異

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

我使用此代碼顯示在管理頁面和用戶的頁面圖像。如果我使用開發環境,此代碼工作正常,圖像顯示在兩個頁面上。但如果我使用製作環境,則此圖像僅在管理頁面中顯示,而不在用戶頁面中顯示。我可以點擊未顯示的圖像,然後選擇「屬性」。在我看到的圖像類型下:

application/xhtml+xml 

但是其他公開圖像下有類型JPG圖像/ PNG圖像或類似的東西。

環境之間的哪些區別可能導致圖像不能正常工作,我該如何解決這個問題,這樣圖像才能在所有頁面上正確顯示?

+0

看看這些文檔,他們提到了很多可能出錯的東西:http://apidock.com/rails/ActionController/DataStreaming/send_file。 –

+0

問題出在應用程序代碼(過濾器之前)的訪問限制,在可能的情況下。一位朋友設法爲我修復:) – nikicc

+1

您可以添加您的修復程序作爲答案,以便其他人可以從您的煩惱中學習:) –

回答

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.new(self.name.downcase.dasherize) 

現在,Rails和Apache的是朋友了。我只需要重構這段代碼,因爲它沒有明確地取消所創建的臨時文件的鏈接。最佳做法是明確取消臨時文件的鏈接。

相關問題