2013-02-11 3 views
0

저는 Flex 모바일 애플리케이션을 개발 중이며 이미지 업로드 진행 상황을 보여줄 필요가 있습니다.Flex 4.6 모바일 앱의 진행 이벤트

코드는 다음과 같습니다

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 %로 표시하십시오.

내 잘못을 추측 할 수 없습니다.

감사합니다.

+0

코드에 문제가있는 것을 확인하십시오. imageProgress 메서드가 호출되고 있습니까? "trace (evt.bytesLoaded);"를 추가하십시오. 그것을 확인하려면 –

+0

나는 label_upload.text로 인해 텍스트가 확실히 업데이트 될 것이라고 생각하지 않는다고 생각합니다. 모두 똑같은 것을 추적 할 것입니다. – Apalabrados

+0

imageProgress 이벤트가 호출되지 않으므로 업데이트되지 않았습니다. – Apalabrados

답변

1

플래시는 파일 업로드를위한 진행 이벤트를 제공하지 않으며 다운로드 만합니다.

진행 이벤트가 필요한 경우 파일을 섹션으로 분할하고 한 번에 각 섹션을 업로드해야합니다. 각 섹션에 대한 완료 이벤트에 대한 응답으로 진행 메시지를 수동으로 업데이트합니다. 예를 들면 :

//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의 측면에서 도움을 줄 수는 없지만 스택에서의 질문은 대답을 얻도록 이해한다.

+0

그럼, 멀티미디어 요소 (이미지, 비디오 등)를 업로드 섹션으로 나눠서 PHP로 결합하는 방법은 무엇입니까? 그것은 쉽지는 않지만 실제로는 들리지 않습니다. – Apalabrados

+0

확장 내 대답 –