2013-12-13 10 views
0

我的網站允許用戶向圖像添加文本,並通過Ajax.request向他們顯示結果。有時候效果很好,但其他時候圖片不完整,javascript記錄錯誤「圖片損壞或截斷。」Rails:在繼續執行邏輯前,等待圖像文件完全由RMagick寫入

在將Ajax響應發送回瀏覽器之前,如何確保文件完全寫入?

VIEW 
    new Ajax.Request('<%= url_for(:action => "update_image", :id => @user_image.id) %>?greeting=' + encodeURIComponent(elmgreeting.value), { onSuccess: document.getElementById("card_image").src=card_filename }); 

MODEL 
    def create_card 
    img = Magick::Image.read(self.input_image).first 
    # ... add the greeting to the image 
    img.write(self.card_filename) 
    self.card_width = img.columns 
    self.card_height = img.rows 
    self.card_size = img.filesize 
    end 

CONTROLLER 
    def update_image 
    @user_image = UserImage.find(params[:id]) 
    @user_image.greeting = params[:greeting] 
    @user_image.create_card 
    @user_image.save 
    render :layout => false 
    end 

[我也注意到分配給card_size的img.filesize值往往不準確,導致我認爲它正在獲得太早,也是如此。)

我用盡了一切我可以找到在stackoverflow和其他地方,但只是無法弄清楚。任何幫助不勝感激。

發現我的問題:這是Ajax請求。它現在很好地工作:

new Ajax.Request('<%= url_for(:action => "update_image", :id => @user_image.id) %>?greeting=' + encodeURIComponent(elmgreeting.value), { onComplete:function(request){document.getElementById("card_image").src=card_filename}}); 

回答

0

afaik你寫的東西應該已經是同步的,有可能是別的東西打破了東西。你的rails服務器日誌說了什麼?也許有一個錯誤發生,並引發一些錯誤,然後你的前端嘗試使用它作爲圖像源

+1

感謝您的迴應,尼古拉。你所說的話反映了我的想法,即過程應該已經同步。但是我沒有收到任何錯誤,正如我所說的,我在create_card方法中獲得的img.filesize值通常是錯誤的(太小)。所以......我不知道。在執行下一個命令之前,「文件寫入」命令是否應該等待文件被系統完全寫入?它似乎並沒有這樣做。 – snackpiano

+0

不,我懷疑,我非常肯定,在'ing.write'完成時,所有的系統級調用都完成了。我建議將映像文件轉儲到FS上的某個位置,並在它失敗時進入並檢查它看起來如何。 – Nikolay

+0

我已經完成了該操作,並且該文件看起來很好。但瀏覽器中的版本不完整。所以顯然,瀏覽器在完全寫入之前正在檢索它,但是在我自己查看它時完成了。這就是爲什麼我很困惑。 – snackpiano

相關問題