我一直在阅读有关Flash Player 10文件上传安全限制的内容。根据FileReference docs for upload(),上传不必由用户触发(浏览操作必须由用户触发,但那是另一回事)。如果需要的话,这将为多文件上传带来尴尬的用户体验,因为一次只能上传一个文件--因此用户必须为每个文件点击(或按下按钮)以启动上传,但只有在前一个文件上传完成后才能这样做。
另一方面,URLLoader.load()文档指出:
在Flash Player 10及更高版本中,如果您使用多部分Content-Type(例如“multipart/form-data”)来包含上传(在POST主体中的“content-disposition”标头中由“filename”参数指示),则POST操作受到应用于上传的安全规则的限制: 必须响应用户发起的操作(例如鼠标单击或按键)执行POST操作。 此Flash安全文章支持URLLoader文档(请参见“POST API”部分)。
然而,原始白皮书没有说明这一点-只有FileReference的浏览必须是响应于用户发起的操作,而不是(潜在的URLLoader驱动的)上传本身:
当SWF文件使用FileReference.browse()和FileReference.upload()方法上传文件到服务器时,Flash Player会执行两个安全规则:
- 必须在用户事件处理程序(鼠标或键盘事件)中调用FileReference.browse()。 - Flash Player在任何时候调用网络API以执行POST请求并将其发送到服务器时,都会执行这些相同的规则。
就我从实际使用URLLoader API上传文件的情况来看,上传确实不需要来自用户发起的操作;但是,这是因为我正在使用播放器的调试版本,还是因为文档有误?(或其他原因?)
简而言之:文档包含了矛盾的信息,我不信任我的现场测试(面对说不应该起作用的文档)。URLLoader是否可以在没有用户交互的情况下用于上传文件?还是只能使用FileReference?(这将破坏大多数文件预处理可能性,而这恰好是我感兴趣的!)
另一方面,URLLoader.load()文档指出:
在Flash Player 10及更高版本中,如果您使用多部分Content-Type(例如“multipart/form-data”)来包含上传(在POST主体中的“content-disposition”标头中由“filename”参数指示),则POST操作受到应用于上传的安全规则的限制: 必须响应用户发起的操作(例如鼠标单击或按键)执行POST操作。 此Flash安全文章支持URLLoader文档(请参见“POST API”部分)。
然而,原始白皮书没有说明这一点-只有FileReference的浏览必须是响应于用户发起的操作,而不是(潜在的URLLoader驱动的)上传本身:
当SWF文件使用FileReference.browse()和FileReference.upload()方法上传文件到服务器时,Flash Player会执行两个安全规则:
- 必须在用户事件处理程序(鼠标或键盘事件)中调用FileReference.browse()。 - Flash Player在任何时候调用网络API以执行POST请求并将其发送到服务器时,都会执行这些相同的规则。
就我从实际使用URLLoader API上传文件的情况来看,上传确实不需要来自用户发起的操作;但是,这是因为我正在使用播放器的调试版本,还是因为文档有误?(或其他原因?)
简而言之:文档包含了矛盾的信息,我不信任我的现场测试(面对说不应该起作用的文档)。URLLoader是否可以在没有用户交互的情况下用于上传文件?还是只能使用FileReference?(这将破坏大多数文件预处理可能性,而这恰好是我感兴趣的!)
FileReference.Upload()
之前调用FileReference.browse()
。 - Den