8

更新:

正如下面 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,因为我希望用户有一个熟悉的对话框,让他们设置自己的文件名。

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

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

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

文件保存对话框

4

8 回答 8

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 内部没有错误处理
  • 额外的请求时间
  • 额外的服务器负载。
  • 上传和重新下载文件时没有向用户反馈。
  • 跨浏览器/操作系统的用户体验不一致。
    • 一些浏览器实际上会弹出一个消失的新窗口
    • 有些人会离开窗户。
    • 有些根本没有任何新窗口。
于 2011-06-30T17:59:25.127 回答
2

经过长时间的讨论并考虑到我们的用户群,我们的解决方案是:

  1. 检测问题何时发生:在 FileReference SELECT 事件侦听器中,检查用户是否更改了文件名以及是否删除了扩展名。
  2. 如果出现问题,请取消操作。使用带有 navigateToURL() 的“服务器反弹”方法再次开始操作

我们发现大多数情况下,用户并没有更改名称,因此我们很少需要使用不太理想的第二种方法。

请注意,为了缓解前面提到的 navigateURL() 浏览器不一致问题,我们发现在服务器返回的标头中指定“Content-disposition:attachment”很有用。

于 2012-01-24T09:38:46.713 回答
1

可惜这不可用。我可以理解用户可以自由地以他们想要的方式保存文件。但是,如果您忘记添加扩展名怎么办?以我的经验,Flex 然后将文件保存为没有扩展名的普通文件。通过这样做,一些用户可能不知道如何处理他们保存的文件。因为不是每个用户都会知道不同扩展名的含义/是什么,并希望打开带有错误扩展名的文件。我经常看到人们要求打开一个带有奇怪扩展名或根本没有扩展名的特定文件。

我部分明白了为什么 Adob​​e 将其视为功能请求而不是错误。但是看到它如何扰乱事情的过程,您可能更愿意将其视为一个错误。正如我所说,不是每个用户都知道如何打开名为“myfile”而不是“myfile.jpg”的文件。还有多少知道如何打开它的用户将“.cow”设置为图像查看器打开的扩展名,操作系统将如何响应这种奇怪的扩展名?好吧,也许“.cow”是一个不好的例子,但我想你明白了。

解决此问题的方法可能是自己创建函数。这意味着您为用户提供了一个弹出窗口(或您喜欢的方式),其中包含指定文件名、获取文件位置然后保存/取消按钮的选项。然后您可以检查他们是否添加了扩展名,填写了文件名并提供了文件位置(甚至是正确的)。这与 FileStream 功能相结合(如果我没记错的话)应该是创建与保存对话框选项类似的功能的解决方案。

于 2011-08-11T10:47:26.997 回答
1

Eduard在 Adob​​e 的功能请求跟踪器中针对此问题提供了一种解决方法:将文件扩展名加倍,例如“image.jpg.jpg”。这就是我们将要做的,因为对于隐藏扩展名的用户,无论他们是否更改文件名,扩展名都会被删除。

于 2012-07-09T21:39:31.603 回答
0

答案是……你没有。这不仅不是 FileReference(或 File,即 Adob​​e Air)的一部分,也不是我们关心的问题。如果用户想将所有文件存储为 .cow,让他来吧!也许他已经配置了他的机器,以便 .cow 将以 jpeg 格式打开。

老实说,作为一个用户,当有人认为他们有权告诉我要在我的机器上命名文件时,我真的很困扰。

于 2011-06-30T18:00:44.333 回答
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 */);
  • 中性的
于 2011-09-27T14:01:03.810 回答
0

此解决方案没有真正的解决方法,因为它与 Windows 中的默认设置有关。微软决定人们不需要知道扩展名,因此创建了一个隐藏已知文件类型的文件扩展名类型的设置。要解决此问题,用户需要按照此处显示的步骤清除此设置

http://windows.microsoft.com/en-in/windows/show-hide-file-name-extensions#show-hide-file-name-extensions=windows-7

于 2013-08-26T06:02:10.023 回答
-1
file.save(byteData, "myImage.jpg"+Math.floor((Math.random())*100)+".jpg");

你的问题解决了。

于 2015-12-29T10:43:41.587 回答