更新:
正如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");
这会按预期打开保存文件对话框。我正在使用它而不是将byteData发送到PHP,因为我希望用户有一个熟悉的对话框,让他们设置自己的文件名。
当用户将其操作系统配置为显示文件扩展名时,问题就出现了,就像我一样。这意味着在保存对话框中,文件名包含扩展名,如下图所示,因此用户在重命名文件时很容易删除该扩展名。由于此框的默认文件类型为“所有文件”,因此如果删除了扩展名,则文件将以任何类型保存。
我不知道有什么方法可以在保存对话框上强制使用文件类型(如果有一个可能是我首选的路径),那么任何人都可以建议我这样做的安全方法仍然允许用户使用OS的标准对话框自行设置文件名吗?
我确实尝试在save()之前调用FileReference.browse(),如this tutorial所示,但这会引发错误,因为你一次只能执行一次FileReference调用。
答案 0 :(得分:4)
对不起,这是一个已知的主要Flash播放器错误,没有真正的解决方法。
在此投票:https://bugs.adobe.com/jira/browse/FP-2014
(虽然出于某种原因,Adobe称其为功能请求。)
编辑2:
修复了适用于Chrome的FP 11.8,适用于Mac OS和Windows。
https://bugbase.adobe.com/index.cfm?event=bug&id=2898055
编辑:添加navigateTo变通办法信息
执行navigateTo()
的php选项:将文件发布到php页面,其中mime类型为image/jpeg
如果指定了正确的标题,则可以使浏览器显示浏览器的本机保存对话框,它确实维护扩展。但是,该方法还有其他缺点:
答案 1 :(得分:2)
经过长时间的讨论和我们的用户群,我们的解决方案是:
我们发现大多数时候,用户没有更改名称,所以我们很少需要回到第二种不太理想的方法。
请注意,为了缓解前面提到的navigateURL()浏览器不一致问题,我们发现在服务器返回的标头中指定“Content-disposition:attachment”很有用。
答案 2 :(得分:1)
可惜这是不可用的。我可以理解用户可以自由地以他们想要的方式保存文件。但是,如果您忘记添加扩展名怎么办?根据我的经验,Flex然后将文件保存为没有扩展名的普通文件。通过这样做,一些用户可能不知道如何处理他们保存的文件。因为并非每个用户都知道不同的扩展意味着什么,并希望打开具有错误扩展名的文件。我经常看到它很安静,人们会希望打开一个带有奇怪扩展名或根本没有扩展名的特定文件。
我部分理解为什么Adobe将其视为功能请求而不是错误。但是看看它如何搞乱事情的过程,你可能宁愿把它当作一个bug来考虑。就像我说的那样,并非每个用户都知道如何打开名为“myfile”而不是“myfile.jpg”的文件。有多少用户了解如何打开它已经将“.cow”设置为由imageviewer打开的扩展,操作系统将如何响应这种奇怪的扩展?好吧也许“.cow”是一个不好的例子,但我想你明白了。
解决这个问题的方法可能是自己创建函数。这意味着您可以为用户提供弹出窗口(或您喜欢的方式),并指定文件名,获取文件位置,然后保存/取消按钮。然后,您可以检查是否添加了扩展名,填写了文件名并给出了文件位置(甚至是正确的)。这与FileStream函数结合应该(如果我没有记错的话)是一个创建与保存对话框选项类似的功能的解决方案。
答案 3 :(得分:1)
Eduard针对此问题在Adobe的功能请求跟踪器中提供了一种解决方法:加倍文件扩展名,例如“image.jpg.jpg”。这就是我们要做的事情,因为对于隐藏扩展名的用户,无论是否更改文件名,扩展都会被删除。
答案 4 :(得分:0)
答案是......你没有。这不仅不是FileReference(或File,Adobe Air)的一部分,它也不是我们关注的问题。如果用户想要将所有文件存储为.cow,那就让他吧!也许他已经配置了他的机器,以便.cow将作为jpeg打开。
老实说,作为一个用户,当有人认为他们有权告诉我我要在机器上命名文件时,我真的很烦。
答案 5 :(得分:0)
我知道自发布以来已经有一段时间了,但是......参考Amoeba.co-tutorial,你可以这样做(这个例子适用于PNG图像):
files = new FileReference();
files.browse(new Array(new FileFilter("Image (*.png)", "*.png")));
files.cancel(); // Important
files.save(/* Your Data Here */);
答案 6 :(得分:0)
此解决方案没有真正的工作环境,因为它与Windows中的默认设置有关。 Microsoft决定人们不需要知道扩展名,因此创建了一个隐藏已知文件类型的文件扩展名类型的设置。要解决此问题,用户需要按照此处显示的步骤清除此设置
答案 7 :(得分:-1)
file.save(byteData, "myImage.jpg"+Math.floor((Math.random())*100)+".jpg");
你的问题已经解决了。