0

Flexモバイルアプリケーションを開発しているところですが、画像のアップロードの進行状況を表示する必要があります。

コードは次のとおりです。

protected function upload( ba:ByteArray, fileName:String = null ):void {
            if( fileName == null ) {                
                var now:Date = new Date();
                fileName = "IMG" + now.fullYear + now.month +now.day +
                    now.hours + now.minutes + now.seconds + ".jpg";
            }

            var loader:URLLoader    = new URLLoader();
            loader.dataFormat       = URLLoaderDataFormat.BINARY;

            var wrapper:URLRequestWrapper = new URLRequestWrapper(ba, fileName, null, params);
            wrapper.url = "http://www.the_url_to_upload.com/php_content/upload_image.php";

            loader.addEventListener( Event.COMPLETE,            completeImageHandler );
            loader.addEventListener( ProgressEvent.PROGRESS,    imageProgress);
            loader.addEventListener(IOErrorEvent.IO_ERROR,      errorImageUploading );
            loader.load(wrapper.request);
        }
        private function imageProgress(evt:ProgressEvent):void {
            var pcent:Number=Math.floor(evt.bytesLoaded/evt.bytesTotal*100);
            label_upload.text = pcent+"%";
        }

「label_upload」というラベルがあり、ファイルのアップロード時に進行状況のパーセンテージを表示する必要があります。

実際には、すべてが正常に機能しますが、何も変更されない進行状況イベントです。常に0%を表示します。

私は自分のせいを推測することはできません。

ありがとう。

4

1 に答える 1

1

Flash は、ファイルのアップロードの進行状況イベントを提供しません。ダウンロードのみです。

進捗イベントが必要な場合は、ファイルをセクションに分割し、各セクションを一度にアップロードする必要があります。各セクションの完了イベントに応じて進行状況メッセージを手動で更新します。例えば:

//assume file to upload stored as ByteArray called "ba"

//setup counters
currentChunk = 0;
totalChunks = Math.ceil(ba.length/CHUNK_SIZE);
//listener
loader.addEventListener(Event.COMPLETE, completeHandler);

このコードは単一のチャンクを送信します:

function sendChunk():void
{
    const CHUNK_SIZE:int = 4096;
    var request:URLRequest = new URLRequest(destinationUrl);
    request.method = URLRequestMethod.POST;
    request.contentType = "application/octet-stream";
    request.data = new ByteArray();
    var chunkSize:uint = Math.min(CHUNK_SIZE, ba.bytesAvailable);
    ba.readBytes(request.data as ByteArray, 0, chunkSize);
    loader.load(request);
}

CHUNK_SIZE は、一度に送信する最大バイト数です。request.contentType=... データ形式をバイナリに設定します。

それで:

function completeHandler(event:Event):void
{
    //expect a result from server to acknowledge receipt of data
    if (loader.data=="OK")
    {
        if (++currentChunk<totalChunks)
        {
    trace("progress: "+currentChunk+" of "+totalChunks+" sent");
            //send next chunk
            sendChunk();
        }
        else
        {
             trace("finished!");
        }
    }
    else
    {
        trace("OK not receieved from server");
    }
}

これにより、ファイル全体がセクションごとに送信されます。PHPスクリプトは「OK」で応答する必要があります(または他の適切な応答を選択します)-これはloader.dataに表示されます-フラッシュはエラーがなかったことを認識します.

私は常にそれを他の人に任せてきたので、PHPの側面であなたを助けることはできませんが、スタックに関する質問で答えが得られるはずです。

于 2013-02-13T20:36:03.627 に答える