6

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

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

问题是,一旦第一次加载 FileReference,我无法以任何方式卸载它,而且我无法将所有图片的数据保留在内存中,因为它们非常庞大。

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

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

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

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

相关片段:

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

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

我感谢任何提示/想法!

4

4 回答 4

1

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

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

于 2010-01-11T13:41:30.797 回答
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;
        }
于 2010-01-13T05:10:00.597 回答
1

我认为该操作是完全不允许的,有充分的理由。如果您可以通过 ActionScript 代码复制一个新的 FileReference,那么您也可以通过 ActionScript 代码制造一个 FileReference 对象。当然,如果您可以强制上传任意文件,那将是一个非常糟糕的安全漏洞。

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

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

于 2010-01-15T05:16:12.037 回答
1

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

解决这个问题的方法是,在你的第一个之后load(),你需要调用cancel()FileReference 上的方法。从我到目前为止的测试来看,这似乎会清除 FileReference 中的字节,并且load()如果您稍后再次调用它,它仍然可以工作。请注意,这不是 API 中明确定义的行为,因此它肯定会发生变化,但它可能会帮助您同时到达您需要去的地方。

希望有帮助。

于 2010-08-20T18:45:31.227 回答