jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
前段时间介绍过jqueryuploadify上传插件的使用方法,我在使用中遇到过HttpError302错误问题,应该会有很多人在使用中遇到过,在此记录下来:
首先http302是请求被重定向的意思,这就很容易理解了,如果你的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中将sessionid传过去。
yii中代码如下:
$('#<?phpecho$upload_name_id;?>').uploadify({ 'buttonText':'选择文件..', 'fileObjName':'imgFile', 'method':'post', 'multi':false, 'queueID':'fileQueue', /*'uploadLimit':2,*/ 'fileTypeExts':'*.gif;*.png;*.jpg;*.bmp;*.jpeg;', 'buttonImage':'<?phpecho$this->_static_public?>/js/uploadify/select.png', 'formData':{ 'sessionId':'<?phpechoYii::app()->session->sessionID;?>', 'timestamp':'<?phpechotime();?>', 'token':'<?phpechomd5('unique_salt'.time());?>', 'modelName':'<?phpecho$modelName;?>', 'modelId':'<?phpecho$model->id;?>' }, 'swf':'<?phpecho$this->_static_public;?>/js/uploadify/uploadify.swf', 'uploader':'<?phpecho$this->createUrl('uploadify/basicExecute')?>', 'onUploadStart':function(){ $('#<?phpecho$up_upload_name_id;?>img').remove(); $('#<?phpecho$up_upload_name_id;?>a').remove(); $imgHtml='<imgclass="upload_load"src="static/images/upload.gif"align="absmiddle"/>'; $('#<?phpecho$up_upload_name_id;?>').append($imgHtml); }, 'onUploadSuccess':function(file,data,response){ $('.upload_load').remove(); varjson=$.parseJSON(data); if(json.state=='success'){ $("#<?phpecho$d_upload_name_id;?>").remove(); $(yt_upload_name_id).val(json.fileId); $imgHtml='<divid="<?phpecho$d_upload_name_id;?>">'; $imgHtml+='<ahref="<?phpecho$this->_baseUrl?>/'+json.file+'"target="_blank">'; $imgHtml+='<imgsrc="<?phpecho$this->_baseUrl?>/'+json.file+'"width="85"height="75"align="absmiddle"/>'; $imgHtml+='</a>'; $imgHtml+='<ahref="javascript:uploadifyRemove("'+json.fileId+'","<?phpecho$d_upload_name_id;?>","<?phpecho$yt_upload_name_id;?>")">删除</a>'; $imgHtml+='</div>'; $('#<?phpecho$up_upload_name_id;?>').append($imgHtml); }else{ alert(json.message); } }, 'onQueueComplete':function(){ $('.upload_load').remove(); } });
服务端:
if(isset($_POST['sessionId'])){ $session=Yii::app()->getSession(); $session->close(); $session->sessionID=$_POST['sessionId']; $session->open(); }
ps:jquery上传插件uploadify使用心得(总结)
自己使用实例:
1、jsp页面:
<linkhref="jsp/js/jquery_upload/uploadify.css"rel="stylesheet"type="text/css"/> <scripttype="text/javascript"src="jsp/js/jquery-1.4.2.min.js"></script> <scripttype="text/javascript"src="jsp/js/jquery_upload/swfobject.js"></script> <scripttype="text/javascript"src="jsp/js/jquery_upload/jquery.uploadify.v2.1.4.min.js"></script> //jquery文件上传 $(document).ready(function() { $("#uploadify").uploadify({ 'uploader':'jsp/js/jquery_upload/uploadify.swf', 'script':'uploadFile.svl', 'cancelImg':'jsp/js/jquery_upload/cancel.png', 'queueID':'fileQueue', 'auto':false, 'multi':true, 'method':'POST', 'scriptData':{'saveFolder':'stuPhotos'},//GET方式才可生效 'fileExt':'*.jpg;*.gif;*.png',//控制可上传文件的扩展名 'fileDesc':'jpg、gif、png文件',//控制可上传文件的扩展名描述,两者需要同时使用 'buttonImg':'jsp/js/jquery_upload/selectBtn.gif', 'width':80,//"浏览"按钮宽度 'onComplete':function(event,ID,fileObj,response,data){ //alert(response)//response为服务器响应数据 }, }); }); <tdwidth="200"class="tabIndex"style="height:10px">照片:</td> <td> <inputtype="file"name="uploadify"id="uploadify"/> <p> <ahref="javascript:$('#uploadify').uploadifyUpload()">上传</a>| <ahref="javascript:$('#uploadify').uploadifyClearQueue()">取消上传</a> </p> <divid="fileQueue"></div> <inputtype="hidden"name="stuPhoto"id="stuPhoto"/> </td>
2、服务端代码
publicclassUploadFileUtilextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; FiletmpDir=null;//初始化上传文件的临时存放目录 FilesaveDir=null;//初始化上传文件后的保存目录 publicUploadFileUtil(){ super(); } protectedvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException{ doPost(request,response); } protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ try{ if(ServletFileUpload.isMultipartContent(request)){ response.setCharacterEncoding("utf-8");//务必,防止返回文件名是乱码 DiskFileItemFactorydff=newDiskFileItemFactory();//创建该对象 dff.setRepository(tmpDir);//指定上传文件的临时目录 dff.setSizeThreshold(1024000);//指定在内存中缓存数据大小,单位为byte ServletFileUploadsfu=newServletFileUpload(dff);//创建该对象 sfu.setFileSizeMax(5000000);//指定单个上传文件的最大尺寸 sfu.setSizeMax(10000000);//指定一次上传多个文件的总尺寸 FileItemIteratorfii=sfu.getItemIterator(request);//解析request请求,并返回FileItemIterator集合 while(fii.hasNext()){ FileItemStreamfis=fii.next();//从集合中获得一个文件流 if(!fis.isFormField()&&fis.getName().length()>0){//过滤掉表单中非文件域 StringfileName=fis.getName();//获取文件名 StringextName=""; if(fileName.lastIndexOf(".")>=0){ extName=fileName.substring(fileName.lastIndexOf(".")); } BufferedInputStreamin=newBufferedInputStream(fis.openStream());//获得文件输入流 StringuuidName=UUID.randomUUID().toString().replaceAll("-","").toUpperCase();//用UUID生成文件名 BufferedOutputStreamout=newBufferedOutputStream(newFileOutputStream(newFile(saveDir+"/"+uuidName+extName)));//获得文件输出流 Streams.copy(in,out,true);//开始把文件写到你指定的上传文件夹 } } //jquery上传方式返回 response.getWriter().print("uploadsuccess");//成功 } }catch(Exceptione){ response.getWriter().print("uploadfail");//失败 e.printStackTrace(); } }publicvoidinit()throwsServletException{ super.init(); StringserverPath=this.getServletConfig().getServletContext().getRealPath("/");//获取服务器路径 StringtmpPath=serverPath+"/tmpUploadsFolder/"; StringsavePath=serverPath+"/uploadsFolder/"; tmpDir=newFile(tmpPath); saveDir=newFile(savePath); if(!tmpDir.isDirectory()) tmpDir.mkdir(); if(!saveDir.isDirectory()) saveDir.mkdir(); }}
以上内容是小编给大家介绍的jQueryUploadify上传插件出现HttpError302错误的解决办法,希望大家喜欢。