解决uploadify上传文件session失效的问题

据线上反馈,某个页面上传文件的时候失效,刷新页面后退出系统,于是在 beta 环境上尝试复现,成功,是个稳定的 bug,于是开始了探索、解决之旅。

打开 Chrome 浏览器控制栏,仔细观察了下上传前后请求的变化,发现每当点击上传按钮上传文件时,都会更新 session_id。嚯,这个隐隐有种熟悉的感觉,再尝试几次后,定位到是上传组件 uploadify 的问题。这是个 flash 插件,以前遇到过一次,那时是在火狐浏览器上,每次上传文件都会遇到 session 失效情形,于是就用了个 hack 方法解决问题。

先是在上传 url 上手动传递 session id。

$(uploadIdName).uploadify({
     
	...
    'uploader' : '/upload?=',
	...
})

然后在项目入口处判断是否直接传,然后恢复 session

$sid = session_name();
if (isset($_GET[$sid])) {
     
    session_id($_GET[$sid]);
}
session_start();

两把斧下去,问题解决。但是呢,不够优雅,也存在隐患,毕竟是项目入口处直接判断。于是又往深了趴,发现了这个组件为什么会出现 session 失效的原因。

In Uploadify, the Flash file is what communicates with the backend script. Because of a bug in Flash, the 
session cookie is not picked up by the Flash file. To circumvent this, you will need to pass the session data
via theformDataoption. To do this in PHP, use the following code when initializing Uploadify on the front-end page.

大概的意思是,Uploadify 组件使用 Flash 与后台通讯,但由于 Flash 有个 bug,就是在上传文件的时候,不会提取当前页面的 Cookie。这样一来就豁然开朗了,原来是每次上传文件时,就如同一次登陆,会生成新的 session id,老的 session 数据用不上了,导致上传失效,刷新退出。不过此组件也给出了比较优雅的解决方法,如下

$(uploadIdName).uploadify({
     
	...
	'formData' : {
     
	   '' : '',
	},
	...
})

你可能感兴趣的:(Javascript)