脱坑Swfupload

大兄弟 2018年07月21日0   268

一脸好奇地用Swfupload写了个Widget,写得头破血流终于完成的时候,才发现Swfupload还有很多毛病没修复。。。并且官网已经挂了,好像整个插件终止于2.5版,当时手里只有2.2版的,由于2.2版的不支持buttonAction系列事件,只能换2.5的,后来翻箱倒柜才找到这个2.5版的。

写完Widget后发现这个插件上传的文件mime全都是application/octet-stream 的,很无语。。。有点不能接受

今天使用百度上传插件重新写了一遍。。mmp。。说实话,百度的上传插件比这个Swfupload好用多了,当初怎么这么想不开去用swfupload...


以下为这款插件的bug

已知的问题 Known Issues

Flash Player以及许多浏览器的bug 困扰着SWFUpload. 但是我们一直在努力。

linux上的取消 Cancelling in Linux

使用Flash 9 Player以及更早版本,在linux操作系统上执行取消上传功能将可能导致浏览器崩溃。不过新版本的Flash Player改善了这个问题。

linux上的上传进度 Upload Progress in Linux

linux上的 Flash Player只在上传完毕后发出一次上传进度事件 (uploadProgress) ,而不是像windows里那样上传过程中不断发出。

这是由于一些linux分发版会在上传过程中锁定整个浏览器。

MAC上的上传进度 Upload Progress in OS X

我们收到了一些关于MAC操作系统上Flash Player不能触发uploadProgress事件的报告。详细的情况还有待了解,但请注意其潜在的问题

MIME Type

无论文件的实际MIME格式是什么,Flash Player以 mime格式application/octet-stream 上传所有的文件

文件最大可选择数 Maximum number of selected files

Flash Player本身并没有限制可选择上传文件数的最大值,但是限制了总文件名的最大长度。这个字符串是这样组成的: "文件名"空格"文件名"...。能上传文件的个数取决于操作系统对文件名总长度的限制。如果用户选择了过多的文件,将会收到flash player的警告消息,并且显示在文件选择对话框里(yukon:我在xp一次上传了173个文件仍然没警告。。)

代理 Proxies

Flash Player可能不能正常的使用代理。 它在处理代理验证时候有些问题,可能导致某些冲突。

有些杀毒软件使用一个本地客户端代理来接收上传的文件并进行扫描,(貌似是截获了上传文件,并把它写入一个代理服务器,扫描完毕后才会真正发送给目标服务器)这导致SWFUpload错误的以为整个文件被上传了,它将的发出大量的uploadProgress事件,直到100%完毕。当代理真正地上传给目标服务器的过程中,SWFUpload看起来像是被暂停了。

卡巴斯基杀毒软件:卡巴斯基 (和其他一些杀软)实现了一个用户端的代理,用来截获本地上传出的数据。SWFUpload不能检测这个代理系统的存在。这些代理服务器能非常快地接收上传的文件,扫描后再发送给目标文件。

apache安全模块 Apache mod_security

Apache的安全模块 mod_security验证服务器收到的 POST消息. Flash Player实现了一个边缘化的方式 (an edge case 翻成取巧的方式?) (有个参数可以决定是否验证) POST 上传文件,服务器也实现了。

安全套接层协议层 SSL

我们收到一些报告称Flash Player 不能通过SSL来上传. 这个问题的具体情况还没被确认,但是看起来确实在ssl下上传并不可靠。特别是使用公匙-自签名证书(self-signed certificates)时会出现问题。

同样,由不被信任的签发机构CA发放的 SSL 证书不能被Flash接受。因为flash并没有提供一个这样的接收证书的方法。就像前面说的cookie bug,windows下的flash player只接收它所信任的名单中的CA发放的证书,而不管浏览器正在使用中的证书。

授权 Authentication

HTTP 的授权验证机制不能被Flash Player良好的支持. 最新版本的 Flash Player会好一些,旧版本的可能会造成浏览器崩溃 。

过早终止连接 Prematurely terminated connections

过早终止连接 Prematurely ending the response (比如ASP.NET中的Response.end()方法) 会导致原本上传完毕,SWFUpload却报告上传失败。

文件的POST名 Filedata POST name in Linux

改变文件接收名 (默认 “Filedata” ,设置对象中file_post_name属性) 在Linux的 Flash Player中并不起作用.

Cookie bug

在Windows 下非IE浏览器 (FireFox, Opera, Safari, etc) flash插件将会发送IE的cookie . 这破坏了很多服务器的session和授权验证机制

开发者必须自己手动解决传递 Session 和授权 cookie 信息的问题,还要自己手动修改在服务器上的session。如果他们想使用session。

不过SWFUpload软件包里提供了一个PHP 或 ASP.Net里解决此bug的例子代码。

ExternalInterface类的bug( ExternalInterface bugs)

当和浏览器/js交互时,Flash Player不能正确使用escape方法编码数据。SWFUpload为解决这个问题做了很大的努力。将来如果这个bug修复了,SWFUpload将会发送而外的escape编码数据.

超长服务器数据bug (Server Data length bugs)

过长的服务器响应数据在MAC或Linux系统中的Flash Player下会导致错误。数据可能会被裁短,改变或者某些重复。我们建议服务器发回的数据尽量的短小简明。

Avant Browser

一旦被缓存了,SWFUpload不能正确工作在Avant浏览器上.

SWFUpload v2.2.0版本后添加了 prevent_swf_caching 设置来试图解决这个问题 .

文件选择对话框与页面改变 File Dialog & Page Changing

在出现文件选择对话框时离开或者刷新页面将会导致浏览器崩溃。(所有浏览器,所有操作系统下)

这种情况大多出现在你设定了一个超级链接<a>的“onclick”调用selectFile/selectFiles ,但又没有禁止它默认的转跳动作,点击这个超链的同时会跳到其他页面但同时又打开了文件选择对话框。。

(yukon:还有种可能:程序使页面强制刷新、重定向。比如HTML <meta>标签里的refresh, ASP.NET的Response.Redirect(),php的header()等)

服务器脚本执行时间过长 Long Running Upload Scripts

Flash上传文件给web服务器后,上传接收程序就会被执行。 接收程序决定是否存储它们,创建缩略图,扫描病毒等等,如果接收程序30秒内不返回任何数据,Flash将断开链接,并返回一个IO错误。

如果你不想这样做,那么在处理的过程中,让服务器返回几个字符或者数据(如果你可以)。

比如PHP,虽然PHP脚本能在Flash断开后继续成功地完成操作,但断开之后Flash将不会接收到任何返回数据。

窗口模式 WMODE / BUTTON_WINDOW_MODE

在某些浏览器中,如果flash控件没有处于屏幕显示区域,设定的WMODE(由BUTTON_WINDOW_MODE设定)会阻止flash控件的载入。,只有当你拉动滚动条,让flash控件处于屏幕显示区域,才会加载并呈现。

(yukon:这样做是为了让页面尽快呈现,比如你打开一个存满图片的文件夹,查看方式调为缩略图,猛的下拉,会看见下面的图片文件逐渐显示出内容来)

这种特性可能会对SWFObject插件有不利的影响。SWFUpload事件可能不会被触发,按钮的背景图可能不会被载入除非控件呈现完毕。

某些操作系统中 (Linux ) 当 WMODE被设置为透明, Flash 打开的文件选择对话框会在浏览器窗口之后。

内存泄露 Memory Leaks

一些浏览器 (特别是 IE)不能在flash player用 ExternalInterface类与js交互后回收内存,(比如 SWFUpload). 生成过多的SWFUpload实例并且刷新几次页面将导致浏览器占用内存过多,进而导致浏览器崩溃或者其他一些系统错误。

在 v2.2.0版本的 SWFUpload中,我们实现了一些预防内存泄露的机制。但是还是推荐您在页面关闭时候调用destroy()方法。如果你在一个页面使用几百个SWFUpload实例,你必须小心测试以防内存泄露。

有关MAC操作系统的一些问题 Other Mac Issues

  • 服务器返回的数据或 Mac系统上的 Flash Player 可能并不会触发 uploadSuccess 事件.我们添加了一个 assume_success_timeout 设置来帮助解决这个问题 。但是通常情况下,在接收成功后返回一个简短的字段是十分容易且可靠的。

  • 有些用户反映在Mac系统下上传给含子域名的地址时有一些问题

  • 有些用户反映重定向(HTTP 状态码 302) 不能被 Mac Flash Player很好的处理. Windows 下似乎没这个问题. 302 重定向经常用在一些授权模式和MVC设计框架中。

  • flash的开发文档指出 在早于 OS X 10.3版本的系统中, bytes loaded 一直会是 -1. SWFUpload把它改成了 0,但是 total bytes将不会被发送出来,进度永远到不了100% 。因此请设定在上传完毕,发出uploadSuccess 或 uploadComplete事件时更新UI让其显示100%。以此来让UI在各系统统一。

  • 有些用户反映Mac Flash Player上传路径有空格字符时将出现问题. 请将它们替换成+或者%20

  • 有些用户反映Mac Flash Player 会在 HTTP HOST头里加入端口号 (比如 http://www.example.com:80). 如果你检查这个参数,要小心对付这个问题。

  • 文件如果只包含一个资源分支(resource fork),将会被Flash Player以0字节文件对待,不能上传(提示: Flash Player 10.1可能解决了这个问题)