2010-04-19 108 views
5

最近幾個月我在我的PHP應用程序中一直使用Uploadify,我一直在試圖追蹤一個難以捉摸的bug。當發生致命錯誤時,我會收到電子郵件,併爲我提供了大量細節。我收到了幾十個。然而,我沒有能夠自己重現這個問題。一些用戶(如我)沒有遇到任何問題,而其他用戶則可以。使用Uploadify時,爲什麼某些POST數據會丟失?

在我詳細說明問題之前,請看下面的流程。

  • 用戶訪問我正在使用的CMS中的頁面編輯屏幕。
  • 頁面的記錄ID作爲隱藏值放入表單中。
  • 用戶單擊Uploadify瀏覽按鈕並選擇一個文件(只允許單個文件選擇)。
  • 用戶點擊我的表單提交按鈕。
  • jQuery攔截表單提交動作,觸發Uploadify開始上傳,併爲提交動作返回false(手動取消表單提交事件以便Uploadify可以接管)。
  • Uploadify上傳到自定義流程腳本。
  • Uploadify完成上傳並觸發Javascript完成回調。
  • Javascript回調調用$('#myForm')。submit()提交表單。

現在,這是應該發生的。我收到了100%的上傳凍結報告以及顯示「I/O錯誤」的其他報告。

發生了什麼事情,表單正在提交完成回調,但表單中存在的一些帖子參數根本不在帖子數據中。我之前說過的頁面的id是作爲隱藏字段添加到表單中的,在發佈數據($ _POST)中根本不存在 - $ _POST數組中沒有用於'id'的項目。奇怪的是,發佈數據DOES包含一些字段的值。例如,我有一個名爲「name」的文本輸入用於記錄名稱,並且它顯示在發佈數據中。

以下是我收集:

  • 這已經發生在Mac OSX 10.5和10.6,Windows XP和Windows 7的,我可以張貼詳細的用戶代理字符串是否有幫助。
  • 用戶必須使用Flash 10.0.12或更高版本。我們已經完成了,所以如果他們有< 10.0.12,表單會恢復爲使用正常的「文件」字段。

有沒有人有任何想法可能是什麼原因?

+0

+1因爲我在Uploadify中遇到了同樣的問題。客戶報告錯誤,特別是圖像上傳返回I/O錯誤或凍結。無法在開發過程中重現錯誤 - 絕對不能與文件大小/連接相關。 – Jeriko 2010-04-26 12:48:13

回答

3
IOError: Client read error (Timeout?) 

雖然我的服務器端是python/django,但我得到了相同的錯誤。我認爲這是客戶端超時,但回頭看看你現在的日誌,當我改變認證程序中的某些東西時,似乎有這種停止的巧合。有可能服務器正在接收文件,但拒絕將其寫入存儲?

此外,你知道幾個Flash客戶端不發送cookie?您必須通過將會話密鑰注入到uploadify的'scriptData'變量中來解決此問題。

x --------------------------------

編輯。這個python/django代碼從uploadify提交的例程開始:

# Adobe Flash doesn't always send the cookies, esp. from Apple Mac's. 
# So we've told flash to send the session keys via POST. So recreate the 
# session now. Also facilitates testing via curl. 
cookie_name = settings.SESSION_COOKIE_NAME 
if request.member.is_anonymous() and request.POST.has_key(cookie_name): 

     # Convert posted session keys into a session and fetch session 
     request.COOKIES[cookie_name] = request.POST[cookie_name] 
     SessionMiddleware().process_request(request) 

# boot anyone who is still anonymous 
if request.member.is_anonymous(): 
    response['message'] = "Your session is invalid. Please login." 
    return HttpResponse(simplejson.dumps(response), mimetype='application/json') 
+0

是的,我們通過scriptData注入必要的值。也許我們應該嘗試發送會話ID。 不確定不寫。我需要檢查的東西。 – 2010-04-26 18:14:24

+0

除非你的客戶是同質的,你必須通過scriptdata發送會話密鑰;你不能依靠Flash來發送cookie。許多組合不起作用。我不記得具體,但它就像閃光燈在Mac + FF會發送cookie,但在Mac + Safari下閃光燈不會,反之亦然。同樣,Windows有閃存不會發送cookie的組合。 – 2010-04-27 07:54:39

+0

基本上我們正在發送的參數是「user_id:1234,blah:'something'」。然後,上傳腳本正在接收這些內容,並且我們手動設置$ _COOKIE的值,如下所示:$ _COOKIE ['user_id'] = $ _POST ['user_id']。這工作到目前爲止......也許這不會一直工作? – 2010-04-30 04:19:06

0

Uploadify可能會改變表單。在uploadify完成並調用回調函數時,查看錶單的html/DOM樹。

0

您是否嘗試過在Firefox中使用Live HTTP Headers來查看是否存在導致發佈數據丟失的某種重寫事件?

相關問題