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}});
感謝您的迴應,尼古拉。你所說的話反映了我的想法,即過程應該已經同步。但是我沒有收到任何錯誤,正如我所說的,我在create_card方法中獲得的img.filesize值通常是錯誤的(太小)。所以......我不知道。在執行下一個命令之前,「文件寫入」命令是否應該等待文件被系統完全寫入?它似乎並沒有這樣做。 – snackpiano
不,我懷疑,我非常肯定,在'ing.write'完成時,所有的系統級調用都完成了。我建議將映像文件轉儲到FS上的某個位置,並在它失敗時進入並檢查它看起來如何。 – Nikolay
我已經完成了該操作,並且該文件看起來很好。但瀏覽器中的版本不完整。所以顯然,瀏覽器在完全寫入之前正在檢索它,但是在我自己查看它時完成了。這就是爲什麼我很困惑。 – snackpiano