6

私のプロジェクトでは、ユーザーが FileReference クラスを使用して画像を選択できるようにしています。次に、load() 関数を使用して、これらの画像を .data プロパティに読み込みます。この後、いくつかのローカル操作を実行し、それらをサーバーに送信します。

私がやりたいことは、選択した FileReferences をもう一度反復処理し、それらを .data プロパティにロードし、別の操作を実行して、もう一度サーバーに送信できるようにすることです。ユーザーが呼び出したイベントからこれを行うことができるはずであることはわかっていますが、それはここでは問題ではありません。

問題は、FileReference が初めてロードされると、それをアンロードすることができず、メモリ内のすべての画像のデータを保持できないことです。これらは巨大であるためです。

したがって、私ができることは 1 つだけだと思います。それは、FileReference で DeepCopy を実行することです...次に、最初のバージョンをロードし、それを廃棄して、2 回目の「実行」にコピーを使用することができます。

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

それを一時ファイルにコピーしてから、一時ファイルをアップロードすると機能しますか? 例えば

        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

私はあなたがやっていることとほとんど同じことをしようとしていました.いくつかの答えを読んだ後、私はほとんどあきらめましたが、それを行う方法を見つけたと思います. FileReference オブジェクトがあり、load()複数回呼び出すと機能することがわかりましたが、主な問題は、最初の読み込み後に高解像度のバイトをメモリに保持していることです。おっしゃる通り、画像処理を知らない人にとっては、これは大したことではありません。

これを回避する方法は、最初の の後、FileReferenceload()でメソッドを呼び出す必要があることです。これまでのテストから、FileReference のバイトがクリアされ、後で 2 回目に呼び出しても機能するcancel()ように見えます。load()これは API で明示的に定義された動作ではないため、変更される可能性がありますが、その間に必要な場所に移動するのに役立つ場合があります。

それが役立つことを願っています。

于 2010-08-20T18:45:31.227 に答える
1

正当な理由により、操作は完全に許可されていないと考えています。ActionScript コードを使用して新しい FileReference を複製できる場合は、ActionScript コードを使用して FileReference オブジェクトを作成することもできます。もちろん、任意のファイルのアップロードを強制できるとしたら、これはかなり悪いセキュリティ ホールになります。

データのコピーをメモリに保持することは、それほど悪い解決策ではありません。結局のところ、それは一時的なものです。通常のクライアント コンピュータは、数百 MB の余分なデータを問題なく管理できるはずです。これは、ブラウザに 2 つの別々のアップロードを実行させるよりも確かに優れたオプションです。

この問題に対するまったく別の潜在的な解決策は、Flex による画像操作を完全に回避することです。Flex はアップロードされたファイルをサーバーに直接投稿でき、サーバーは画像操作自体を行うことができます。もちろん、操作がユーザーの操作によって行われる場合、それはまったく機能しません。

于 2010-01-15T05:16:12.037 に答える
1

ObjectUtil.copy は使用できません。このメソッドは、データ オブジェクト (VO クラス) のみをコピーするように設計されています。

新しい FileReference を作成し、プロパティを 1 つずつコピーする必要があります。これを行う関数を作成します..

于 2010-01-11T13:41:30.797 に答える