由于缺少用户交互,Cairngorm SequenceTask + URLLoader抛出SecurityError

时间:2011-03-23 21:35:05

标签: flash actionscript-3 asynchronous swfupload cairngorm

我正在尝试让应用程序上传多个客户端生成的图像(不是文件,因此我不能使用FileReference),同时显示上传的进度。事实证明这比应该的更难。我正在使用Cairngorm Task库对客户端上生成的图像执行以下步骤:

  1. 生成绘制舞台区域内容的BitmapData对象
  2. 以异步方式将图像编码为JPEG,以显示进度条(请参阅http://dgrigg.com/blog/2009/03/05/as3-jpegencoder-and-big-images/
  3. 异步上传图片(分块,请参阅http://soenkerohde.com/2010/01/chunk-file-upload/)以显示进度
  4. 当用户点击一个按钮时,SequenceTask开始运行,编码就像一个魅力,但是当上传任务发生时,它会突然出现错误:

      

    SecurityError:错误#2176:某些操作(例如显示弹出窗口的操作)只能在用户交互时调用,例如通过鼠标单击或按下按钮。

    我相信这是因为您无法在没有用户干预的情况下启动URLLoader.load操作。即使用户 点击按钮,我认为因为事情开始异步发生,这个点击事件不再被视为发起人。

    有没有办法让URLLoader知道这是鼠标点击的结果?这对于分块上传工作是必不可少的,因为所有后续的块也会启动一个新的URLLoader,所以我不能100%确定参考的分块上传器实际上是有效的。我可能会先尝试只运行普通代码。

    感谢任何想法。

3 个答案:

答案 0 :(得分:1)

您必须更改应用程序流,以便在上传之前强制用户进行交互。

此行为是在Flash Player 10上引入的(我几乎可以肯定,这不会发生在Flash Player 9上的URLLoaders)和没有办法绕过它,否则它将是一个主要的安全漏洞。调度“假”鼠标事件将不起作用,上传/ POST必须在捕获用户交互(鼠标单击或键盘快捷键)的同一个调用堆栈上完成。

查看"User interaction requirements in Flash Player 10"了解详情。

答案 1 :(得分:0)

您可以通过调度MouseEvent对象来模仿用户操作吗?

我已经尝试通过调用它来完成FileReference.save()(它不能在没有用户交互的情况下工作),但是它有效,所以也许我的配置有些不同

答案 2 :(得分:0)

我现在遇到的问题与你的问题相同。我有几个图像,只有第一个上传工作像魅力,但在第二次上传,它停止产生以下错误:“SecurityError:错误#2176”,并看着你的帖子我意识到这是由于内部调用第二次上传而不是用户互动。

我尝试了很多选项,然后其中一个选项在开始下一次上传和相同错误之前用close()关闭了URLloader。诀窍在于模仿用户交互。