ThinkPHP下使用Uploadify外掛提示HTTP Error (302)錯誤的解決辦法
最近用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引數中定義一個SESSION資料,這樣就可以通過$_POST或$_GET的方法將SESSION資料傳送到控制器,在控制器_initialize方法中把傳遞過去的SESSION資料設定為當前會話的SESSION,這樣就可以通過驗證了,但是,這裡需要注意一條,重新設定SESSION必須要放在執行驗證登陸函式的前邊,否則無效,因為如果登陸驗證不通過,那麼後邊的程式碼就都不會執行了;
客戶端(ThinkPHP上傳檔案模板)程式碼
js程式碼
$(function() {
$('#file_upload').uploadify({
'formData' : {
'session_name': "<?php echo $_SESSION['session_name']; ?>",
},
//後邊對於解決本問題無關程式碼省略。。。
})
}
伺服器端(ThinkPHP控制器)程式碼
php程式碼
//初始化執行
publicfunction _initialize(){
//此處為解決Uploadify出現http 302錯誤 重新設定SESSION
if(isset($_POST['session_name'])) {
$_SESSION['session_name'] = $_POST['session_name'];
}
//執行登陸驗證檢測函式
$this->powerverify();
}
————————————————
版權宣告:本文為CSDN博主「一夜長風」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/wlzx120/article/details/71598676
首 先http 302是請求被重定向的意思,這就很容易理解了,如果你的uploadify處理上傳指令碼有session驗證,就會出現此錯誤,因為flash在執行 post請求的時候沒有包含cookie資訊,而伺服器的session會根據客戶端的cookie來得到SESSIONID。沒有提交cookie自然 就不能獲取到session,然後uploadify就返回了302(請求被重定向)的錯誤。
解決辦法當然是把session_id的值傳到服務端:
<script>
$(document).ready(function(){
$('#file_upload').uploadify({
'uploader':'uploadify/uploadify.swf',
'script':'uploadify.php',
'folder':'uploads/file',
'formData':{'session':'<?phpechosession_id();?>'},
'onComplete':function(event,ID,fileObj,response,data){
alert(response);
}
});
});
</script>
然後在伺服器端session驗證之前:
if(isset($_POST['session'])){
session_id($_POST['session']);
session_start();//注意此函式要在session_id之後
}
當然,你也可以直接在url中將session id傳過去。
TP框架uploadify HTTP 302 錯誤如何解決?
在核心類資料夾裡下的Conf/convention.php中 將VAR_SESSION_ID開啟(建議在模組的conf檔案中新增配置,如在Admin模組下的Conf/config.php中新增 'VAR_SESSION_ID' => 'session_id',)
在程式碼中傳遞session_id引數
參考:http://www.uploadify.com/documentation/uploadify/using-sessions-with-uploadify/
jquery上傳外掛uploadify 報錯http error 302 解決方法之一
前段時間用到jquery上傳外掛uploadify時,始終出現系統報出http error 302的錯誤。
網上大量蒐集資訊,基本上都是說session值丟失的問題,根據網友提供的解決方案進行修改,問題並沒有解決。
因此,不排除這是解決302錯誤的解決方法之一,但是我接下來提出另一解決方案,考慮到非同步傳輸的問題,供大家參考(反正我是成功了)。
首先是uploadify初始化:
$(function() {
$('#projectfile').uploadify({
'swf' : '${ctxStatic}/scripts/jqext/uploadify/uploadify.swf',
'uploader' : '${ctx}/utmmanager/utm/insert',
//session的方案,就是在此uploader的值中新增:JSESSIONID=${pageContext.session.id},
'auto' : true, 並且增加一行'formData' :{'JSESSIONID':"${pageContext.session.id}"},
'buttonText' : '匯入',
'multi' : false,
'fileObjName' : 'file',
'method' :'post',
'onUploadSuccess' : function(file,data,response) {
var json_data=eval("("+data+")");
alert("<br>成功匯入條目數:"+json_data.successLen+"<br>失敗匯入條目數://此處需要返回的是json資料,
"+json_data.errorLen+"<br>匯入失敗條目:<br>"+json_data.errorData);不是跳轉路徑。具體看下面分析。
},
'onUploadError' : function() {
alert("失敗");
}
});
});
其次是Controller方法:
需要新增@ResponseBody
@responsebody表示該方法的返回結果直接寫入HTTP response body中,一般在非同步獲取資料時使用。
在使用@RequestMapping後,返回值通常解析為跳轉路徑,加上@responsebody後返回結果不會被解析為跳轉路徑,
而是直接寫入HTTP response body中。比如非同步獲取json資料,加上@responsebody後,會直接返回json資料。
作用:
該註解用於將Controller的方法返回的物件,通過適當的HttpMessageConverter轉換為指定格式後,
寫入到Response物件的body資料區。
時機:
返回的資料不是html標籤的頁面,而是其他某種格式的資料時(如json、xml等)使用;