最近用ThinkPHP開發一個項目,集成了批量上傳文件插件Uploadify,在谷歌Chrome和IE下都能正常上傳,只有火狐下提示這個錯誤,網上找了很多解決辦法,基本都說flash在firefox下重新發起session會話,由於session沒有驗證通過所以報錯,這個問題網上有很多解決方案,但是試了很多,都沒有真正解決我的問題,最後看了官方的解決方案
http://www.uploadify.com/documentation/uploadify/using-sessions-with-uploadify/
才真正解決,我用的是ThinkPHP框架,同時我開啟了_initialize()(不知道這個函數的去看下ThinkPHP幫助手冊),在這個函數裡,我執行了一個檢測用戶是否登陸的驗證函數,這樣每次訪問控制器,都會執行驗證用戶是否登陸有權限執行相應操作,但是因為在火狐中,flash發起的請求並沒有連同SESSIONID一同發送到ThinkPHP控制器,所以導致了無法通過用戶登陸請求,這時我們可以在uploadify的formData參數中定義一個SESSIONID,這樣就可以通過$_POST或$_GET的方法將SESSIONID發送到控制器,在控制器把傳遞過去的SESSIONID設置為當前會話的SESSIONID,這樣就可以通過驗證了,但是,這裡需要注意一條,重新設置SESSIONID必須要放在執行驗證登陸函數的前邊,否則無效,因為如果登陸驗證不通過,那麼後邊的代碼就都不會執行了,我之前就犯了這樣的錯誤,將重置SESSION放到了上傳文件處理的函數中,下面貼上詳細的代碼,以供大家參考:
客戶端(ThinkPHP上傳文件模板)代碼
$(function() { $('#file_upload').uploadify({ 'formData' : { '<{:session_name()}>' : '<{:session_id()}>', //此處獲取SESSIONID 'timestamp' : '<{$timestamp}>', 'token' : '<{$token}>' } //後邊對於解決本問題無關代碼省略。。。 }) }
服務器端(ThinkPHP控制器)代碼
//初始化執行 public function _initialize(){ //此處為解決Uploadify在火狐下出現http 302錯誤 重新設置SESSION $session_name = session_name(); if (isset($_POST[$session_name])) { session_id($_POST[$session_name]); session_start(); } //執行登陸驗證檢測函數 $this->powerverify(); }
為大家分享了我自己親身實例之外,還在網上找到了其他朋友的實例進行了整理,希望對大家的學習有所啟發。
標題:PHP Uploadify 火狐下報 302錯誤
大概原因:在Uploadify官網已經說明,是說Flash有一個Bug它提交請求的時候不會自動帶session,所以浏覽器判斷沒有獲取到session值,我用的ThinkPHP框架,_initialize(){}(在執行其他方法前會先執行這個函數,我用它來判斷用戶是否登錄),在這個函數中,我照網上的方法:
基本思路:根據Flash這個bug的原理來做的,就是我們把session值作為一個參數一起上傳.
Uploadify官網也說了解決之道:給一個選項
formData: {‘SESSION NAME':'SESSIOIN ID'}----------------json格式
我用隱藏域把這些變量保存在模板中(值可以得到),然後在js文件中我直接寫作:
var session_name = (使用Jquery通過選擇器獲取得到值) var session_id = (同上); formData: {session_name, session_id},
其他解決思路:
這個問題確實存在,其實這個問題可以轉化為session丟失。雖然您針對session進行了特殊處理,作為參數傳入,但是不代表您服務端正確獲取,建議您進入debug模式跟蹤一下服務器端是否正確獲取參數,並順利加載session。另外還有個問題,如果您當前打開url與您提交form的url是一樣的,還得記得加上隨機數。
以上就是針對ThinkPHP下使用Uploadify插件火狐上傳報302錯誤的解決方法,希望對大家的學習有所幫助。