Flex:文件引用的深度复制

gkl3eglg  于 2022-09-21  发布在  Apache
关注(0)|答案(4)|浏览(160)

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

我想要做的是,能够再次迭代拾取的FileReference,将它们加载到.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类的某些受保护属性阻止它被复制,这是真的吗?如果是这样的话,我能以某种方式避开这一点吗?或者,有没有其他办法来解决我的整体问题?

我很感激任何提示/想法!

jc3wubiy

jc3wubiy1#

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

解决这个问题的方法是,在第一个load()之后,需要在FileReference上调用cancel()方法。从我到目前为止的测试来看,这看起来会清除FileReference中的字节,如果您稍后第二次调用load(),它仍然可以工作。只需提醒一句,这不是API中显式定义的行为,因此它肯定会发生变化,但它可能会帮助您实现所需的目标。

希望这能帮上忙。

sxpgvts3

sxpgvts32#

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

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

zyfwsgd6

zyfwsgd63#

将其复制到临时文件,然后上载临时文件是否可行?例如

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;
        }
mlmc2os5

mlmc2os54#

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

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

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

相关问题