Flex:文件参考的深层复制

时间:2010-01-03 16:02:52

标签: flex actionscript-3 actionscript filereference deep-copy

在我的项目中,我让用户使用FileReference类选择图片。然后我使用load()函数将这些图片加载到他们的.data属性中。在此之后,我执行一些本地操作并将它们发送到服务器。

我想做的是,能够再次遍历挑选的FileReferences,将它们加载到.data属性中,执行不同的操作并再次将它们发送到服务器。我知道我应该能够从用户调用的事件中执行此操作,这不是问题。

问题是,一旦第一次加载FileReference,我就无法以任何方式卸载它,而且我无法保存内存中所有图片的数据,因为这些图片很大。

所以我想我只能做一件事,就是在FileReference上执行DeepCopy ...然后我可以加载第一个版本,废弃它并使用副本进行第二次“运行”。

我尝试使用ObjectUtil.copy,但是当我访问例如副本的.name属性,它失败:

Error #2037: Functions called in incorrect sequence, or earlier call was unsuccessful.

at flash.net::FileReference/get name()

相关摘录:

registerClassAlias("FileReference",FileReference);
masterFileList.addItem(FileReference(ObjectUtil.copy(fr_load.fileList[i])));
trace(masterFileList[i].name)

是否有一些FileReference类的受保护属性阻止它被复制?如果是这样,我可以以某种方式回避这个问题吗?或者我的整体问题还有其他解决办法吗?

我感谢任何提示/想法!

4 个答案:

答案 0 :(得分:1)

你不能使用ObjectUtil.copy。此方法仅用于复制数据对象(VO类)。

你应该创建一个新的FileReference并逐个复制这些属性。创建一个函数来执行此操作..

答案 1 :(得分:1)

将它复制到临时文件然后上传临时文件工作?例如

        var fileRef:FileReference = new FileReference();
        fileRef.browse();

        ......................

        var tmpFile:File =  File.createTempFile();
        try {
            var tmpFileStream:FileStream = new FileStream();
            tmpFileStream.open(tmpFile, FileMode.WRITE);
            trace("Opened file: " + tmpFile.nativePath);
            tmpFileStream.writeBytes(fileRef.data);
            trace("copied file");
        } catch ( error:Error ) {
            trace("Unable to open file " + tmpFile.nativePath + "\n");
            throw error;
        }

答案 2 :(得分:1)

我认为这项行动是完全不允许的,原因很充分。如果您可以通过ActionScript代码复制新的FileReference,那么您还可以通过ActionScript代码制作FileReference对象。当然,如果您可以强制上传任意文件,那将是一个非常糟糕的安全漏洞。

将数据副本保存在内存中确实不是一个解决方案。毕竟,这是暂时的。典型的客户端计算机应该能够毫无问题地管理几百MB的数据。这肯定是比浏览器执行两次单独上传更好的选择,这是您尝试的解决方案最终会做的。

这个问题的一个完全不同的潜在解决方案是完全避免Flex对图像的操纵。 Flex可以将上传的文件直接发布到服务器,服务器可以自己进行图像处理。当然,如果通过用户交互来驱动操作,那么根本不起作用。

答案 3 :(得分:1)

我试图做的几乎就是你正在做的事情,我在阅读了一些答案后几乎放弃了,但我想我找到了办法。我发现如果你有一个FileReference对象,如果你多次调用load(),它会起作用,但主要的问题是你在第一次加载后将高分辨率字节保留在内存中。正如你所提到的,对于那些不了解图像处理的人来说,这是一个很大的禁忌。

解决这个问题的方法是,在第一个load()之后,您需要在FileReference上调用cancel()方法。从我到目前为止的测试来看,它看起来会清除FileReference中的字节,如果你以后第二次调用它,load()仍然可以工作。到目前为止我只在我的系统上试过它,但它在那里工作正常。需要注意的是,这不是API中明确定义的行为,因此它肯定会发生变化,但它可能会帮助您在平均时间内找到所需的位置。

希望有所帮助。

相关问题