查看文章 |
flash上传文件的cookie问题
2009-10-22 23:38
上传文件常用的方法是html的file控件(即<input type="file">这种标记),另一种办法就是用flash了。 用html上传文件的好处是浏览器兼容性强,但是存在的问题也是显而易见的: 1、file控件的定制性不强,在有的浏览器里边比较粗糙,不利于更好地统一用户界面; 2、上传时对文件大小的控制需要在服务器端做出判断。也就是说,只有将文件上传到服务器了,才能知道文件是不是超过了制定的大小。对于服务器宝贵的带宽是一种浪费,同时,大的文件上传时间较长,用户需要等待比较多的时间才能得到一个不能继续上传的提示。 用flash上传文件则相反,具有file控制不可比拟的优势: 1、定制性很强,可以做出很多变化多端的效果来。上传过程还可以做出非常细致的百分比效果出来。 2、能在将文件上传到服务器之前对文件大小做出判断,直接反馈给用户。不但响应时间很快,而且也节省了服务器带宽资源。 不过,flash的劣势也非常明显——浏览器兼容性较差,主要体现在3个方面: 1、需要安装有flash插件的浏览器才能使用,而且有flash版本本身的兼容性问题。比如,有的用AS3写的代码再flash 8播放器上就不能执行。 不过,flash拥有广泛的使用人群,升级制度也比较严格,大部分的用户都会升级到最新的版本。 2、有的浏览器在使用flash之前需要点击一次才能激活使用。这个可以通过js写flash代码来绕过激活机制。不过这招貌似在最新的opera里边行不通了。但是,我们也要看到,opera的使用范围毕竟是少数。 3、存在cookie处理方面的bug。这也正是这篇文章要讨论的主题。 cookie处理的bug主要体现在,通过非ie浏览器上传图片时,flash会将ie下的cookie发送到服务器端,从而引起cookie处理混乱。当上传的文件依赖于cookie信息时,就会出现错误的情况。比如,如果要求上传文件的用户必须已经登录,那么,如果ie下没有登录,当前这个非ie浏览器就不能上传文件,岂不是很郁闷。 这种情况的处理其实也就是抓住一点,在上传文件时,通过url将cookie信息传递到服务器端。 一种办法是flash和js取得通信,js将document.cookie信息传递给flash,flash再将信息在url的参数中传递给服务器端。 还有一种办法就是,通过flash控件的flashvars字段给flash传变量。这种办法能保证在客户端js未开启的情况下也能传递cookie信息给flash,还是比较保险的。不过,需要注意的是,cookie字符串中的空格的编码可能会导致最后解析出错。php通过urlencode编码空格时,会转化为%2B,而通过flash解析后,%2B会被解析为+,而不是空格。这有可能导致最后对用户信息的验证失败。 这种情况下的一个技巧就是,使用两次urlencode对cookie信息进行编码,最后flash传递到服务器端时,就能准确地读出原来的值了。 |
最近读者: