Назначьте тайм-аут запроса для Adobe Air URLRequest и получите ответ без использования eventListner - PullRequest
0 голосов
/ 13 марта 2012

Код ниже используется для чтения файла на диске и загрузки в виде фрагментов размером 1 МБ на php-сервер через приложение Adobe AIR. Он повторяет цикл do / while до конца файла, а загружаемая часть обрабатывается функцией getConnection . Серверы возвращают XML в качестве ответа. С помощью eventListeners в настоящее время он получает функцию onRequestComplete, когда получает ответ. Из-за этой проблемы текущий код выходит из цикла при получении ответа от сервера. Есть ли способ получить ответ на запрос, отправленный функцией getConnection при вызове внутри функции startUpload ? также, как я могу определить время ожидания запроса для этих отдельных запросов?

private function startUpload():void { 

var localFilePath:String =localFilesToUpload[currentUploadedVideoIndex].file.nativePath;
   var filePathArray = localFilePath.split("/");
   var uploadedFile:File = new File(localFilePath);
   var fileSize:Number = uploadedFile.size;
   var fileName:String = filePathArray[filePathArray.length-1];
   var fileId:String = "10";
   var index:Number=0;
   var chunkSize:Number=1024*1204;
   var size:Number=chunkSize;
   var serverPath:String = "http://myurl/rests";

   //encode username and password
   var userName:String="myusername";
   var password:String="mypassword";
   var encoder:Base64Encoder = new Base64Encoder();
   encoder.insertNewLines=false;
   encoder.encode(userName+":"+password);

   var urlLoader:URLLoader=new URLLoader();
   urlLoader.dataFormat=URLLoaderDataFormat.TEXT;
   urlLoader.addEventListener(Event.COMPLETE,onRequestComplete);
   urlLoader.addEventListener(IOErrorEvent.IO_ERROR,onResponceFail);

   var urlRequest:URLRequest = new URLRequest(serverPath);
   urlRequest.method=URLRequestMethod.POST;



   do{
        //if this is true file must be uploaded as a chunk
        if(fileSize>chunkSize){
            if((index+size)>fileSize){ // if true this is the final chunk of the file.
                size = fileSize-index; // take the remaining size of the file
            }
        }else{
            size = fileSize; //this file can be uploaded directly 
        }

        //read the bytes from the file in the specified location
        var buff:ByteArray = new ByteArray();
        var uploadedFileStream:FileStream = new FileStream();
        uploadedFileStream.open(uploadedFile,FileMode.READ);
        uploadedFileStream.readBytes(buff);
        uploadedFileStream.close();

        urlRequest.data=buff;


        //add the http headers to the file part and send 
        this.getConnection(urlRequest, urlLoader,encoder.toString(),fileSize,index,chunkSize,fileName,fileId,buff); 

    }while(index<fileSize)
  }
}


 private function getConnection(urlRequest:URLRequest, urlLoader:URLLoader ,authString:String, fileSize:Number, index:Number, chunkSize:Number, fileName:String, fileId:String, requestBody:ByteArray):void{

    //creates the relevent HTTP heaaders and assigned to parameters
    try{
        urlRequest.requestHeaders = parameters;
        urlLoader.load(urlRequest);
      }catch(error:Error){
        Alert.show(error.message);
    }
 }

 private function onRequestComplete(event:Event):String{
      var loader:URLLoader = URLLoader(event.target);
      Alert.show(loader.data,"Result");
 }

 private function onResponceFail(event:FaultEvent):void{
    Alert.show(event.message.toString(),"Fault");
 }

1 Ответ

0 голосов
/ 13 марта 2012

Чтобы достичь этого, вы должны проверить, завершена ли операция в onRequestComplete вместо:

Псевдокод, чтобы начать работу:

function startUpload()
{
    // prepare big file
    ...
    // then start the uploading
    sendNextChunk();
}

function sendNextChunk()
{
    // grab the next chunk
    ...
    // and send it
    getConnection(...);
}

function onRequestComplete()
{
    // is there more chunks ?
    if (...more chunks?)
        sendNextChunk();
    else
        trace("All chunks uploaded");
}

Надеюсь, это поможет, Аднан

...