替代在FileReference.save()AS3上锁定文件类型

sha*_*hat 8 flash file-type save actionscript-3 filereference

更新:

正如Jacob在下面的回复中所讨论的,限制或纠正FileReference.save的行为是不可能的.任何人都可以提出一个替代方案(服务器是Apache/PHP),它符合我在这篇文章中的所有标准,并避免了我与Jacob讨论过的陷阱吗?

结束编辑

我正在使用FileReference.save()从我的AS3应用程序保存图像.这是代码,工作正常:

var encoder:JPGEncoder = new JPGEncoder(80);
var byteData = encoder.encode(myBMD);  //bitmap data object created earlier
var file:FileReference = new FileReference();
file.save(byteData, "myImage.jpg");
Run Code Online (Sandbox Code Playgroud)

这将按预期打开保存文件对话框.我正在使用它而不是将byteData发送到PHP,因为我希望用户有一个熟悉的对话框,让他们设置自己的文件名.

当用户将其操作系统配置为显示文件扩展名时,问题就出现了,就像我一样.这意味着在保存对话框中,文件名包含扩展名,如下图所示,因此用户在重命名文件时很容易删除该扩展名.由于此框的默认文件类型为"所有文件",因此如果删除扩展名,则文件将保存为无类型.

我不知道有什么方法可以在保存对话框上强制使用文件类型(如果有一个可能是我首选的路径),那么任何人都可以建议我这样做的安全方法仍然允许用户设置文件名本身使用操作系统的标准对话框?

我确实尝试在save()之前调用FileReference.browse(),如本教程所示,但是这会抛出一个错误,因为你一次只能执行一个FileReference调用.

文件保存对话框

Jac*_*ers 4

抱歉,这是一个已知的主要 Flash 播放器错误,没有真正的解决方法。

在这里投票:https://bugs.adobe.com/jira/browse/FP-2014

(尽管出于某种原因,Adobe 将其称为功能请求。)


编辑2:

针对 Mac OS 和 Windows 上的 Chrome FP 11.8 进行了修复。

https://bugbase.adobe.com/index.cfm?event=bug&id=2898055


编辑:添加navigateTo解决方法信息

有一个 php 选项可以执行以下操作navigateTo():将文件发布到具有 mime 类型的 php 页面image/jpeg。如果指定正确的标头,您可以让浏览器打开浏览器的本机保存对话框,该对话框确实维护扩展。然而,该方法还有其他缺点:

  • flex 内部没有错误处理
  • 额外请求时间
  • 额外的服务器负载。
  • 上传和重新下载文件时不会向用户提供任何反馈。
  • 跨浏览器/操作系统的用户体验不一致。
    • 有些浏览器实际上会弹出一个新窗口,然后消失
    • 有些人会离开窗户。
    • 有些根本没有任何新窗口。