【问题标题】:Simulating user event模拟用户事件
【发布时间】:2012-08-23 23:45:37
【问题描述】:

我有一个带有文件 swf 和 HTML 按钮的网页:当我单击按钮时,我想保存(下载到我的磁盘)我的 swf 文件正在显示的当前图像(它是一种图像库)。

当按钮在我的 swf 中时它完美地工作,但是当我通过 ExternalInterface 从 JavaScript 调用保存图像的方法时它会失败。

我验证了 JS-AS 通信(没问题),我知道 FileReference.save() 仅在由用户事件触发时才有效。 很可能,点击 HTML 按钮不会被视为用户事件

除了改变任何东西(例如,在服务器端移动一些代码,将图像发送到服务器,然后下载它......)之外,还有什么方法可以模拟用户事件?任何其他解决方案或提示表示赞赏。

注意:我会使用 Flash 按钮,但 HTML 是必需的。

【问题讨论】:

  • 您将与不同的安全模型作斗争,Flash 可能只会将用户事件视为用户在 Flash 窗口内触发的事件。否则它只是来自外部的函数调用,出于安全原因将被阻止。当前设置的唯一选择是在 flash imo 中使用按钮。另一种选择是使用类似stackoverflow.com/questions/6796974/… 之类的东西来实现 javascript 等效项(通过数据 url 或服务器下载查找保存图像)
  • @pebbl 你得出了同样的结论,我发布了这个问题作为寻找不同解决方案的最后尝试......
  • 当然,为了提供更详细的响应,但需要更多信息来了解服务器/闪存如何存储和公开您的图像。以及您对图像下载的确切期望。我假设通过 FileRef.save() 路由,您希望有一个对话框供用户选择保存位置?
  • @pebbl 是的,我有一个对话框。图像已被第三方合并到 swf 中(每帧一张图像),我将整个舞台保存到 BitmapData 对象中,使用 JPEGEncoder 对其进行压缩,然后调用 FileReference。

标签: javascript events actionscript flash filereference


【解决方案1】:

解决方案(或视情况而定)

基于 Flash

目前我认为最好的办法是坚持在 Flash 中操作按钮。如果您需要将按钮从主 Flash 运行时中移出,您可以尝试使用两个 Flash 嵌入,并使用 LocalConnection 在它们之间进行通信。不过我不建议这样做,因为 LocalConnection 很难正常工作,并且无法保证您不会遇到跨两个实例工作的安全沙箱问题。

基于服务器端

您可以实现一个保存系统,该系统将涉及将图像数据发送回服务器并形成前端可以请求的实际 URL。这将允许您指定您想要下载的任何内容。这样做的缺点是它需要一个服务器(因此不适用于离线应用程序),它还需要相当多的麻烦,以一种方式发送图像数据,然后再将其拉下来......

我在这里详细介绍了这个:

Canvas Image to an Image file

基于 HTML5

目前我不推荐我在评论中建议的数据 URL 下载,因为它还不是一个完整的解决方案。但是,从好的方面来说,我会密切关注顶级浏览器正在实施的内容,因为这个答案可能很快就会改变。

工作原理

基本上,我只是尝试通过数据 URI 实现图像下载(认为这将是解决您的问题的最佳解决方案),一切正常,而且您可以很高兴地从您的 BitmapData 对象中获取所需的 Base64 数据。但是,问题是无法在下载时指定文件名。所以你最终会得到相当丑陋的文件名,甚至没有正确的扩展名。

<a href="data:image/octet-stream;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC">Click to Download File</a>

经过一番研究,似乎没有没有可行的解决方法,但有一些可以实施的规范会有所帮助:

<a download="filename.png" href="data:image/octet-stream;...">Download File</a>

下载属性正是针对我上面提到的问题而设计的,并且允许对下载进行命名。不幸的是,我还没有找到实现它的浏览器......

参考

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    相关资源
    最近更新 更多