AS3 URLLoader POST在浏览器中中止

时间:2014-06-24 20:44:54

标签: actionscript-3 flash post

我重新构建了一个SWF音频上传器,它运行了好几天。但是,我刚刚对我在此项目中构建的所有内容进行了贯彻,并且我注意到对服务器保存音频文件的POST请求在请求中大约10秒后被中止。在20秒时,由于实施了超时限制,一切都会停止。我不太了解AS3或它是如何发出请求的,但我确实知道PHP处理程序文件是可靠的,因为它从最后的工作点开始没有对它进行任何更改。权限为755,并且SWF和处理程序文件的所有权都是正确的。我也可以通过Firebug重新提交请求,它没有任何问题。 我不确定问题究竟来自哪里;无论是浏览器,服务器还是代码问题。我正在阅读有关已中止请求的内容,并且我确保在尝试上传之前没有其他活动请求。我还应该补充说,其他POST / GET请求没有问题,它只是来自SWF的这一个请求。

同样,Flash / ActionScript不是我的强项,所以如果有办法改善我正在做的事情,或者如果有人能告诉我我做错了什么,请告诉我。 / p>

package{
    import flash.display.Sprite;
    import flash.media.Microphone;
    import flash.system.Security;
    import org.bytearray.micrecorder.*;
    import org.bytearray.micrecorder.events.RecordingEvent;
    import org.bytearray.micrecorder.encoder.WaveEncoder;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.events.ActivityEvent;
    import fl.transitions.Tween;
    import fl.transitions.easing.Strong;
    import flash.net.FileReference;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.net.URLRequestMethod;
    import flash.display.LoaderInfo;
    import flash.external.ExternalInterface;

    import flash.media.Sound;
    import org.as3wavsound.WavSound;
    import org.as3wavsound.WavSoundChannel;

    import com.adobe.serialization.json.JSON;
    import com.adobe.serialization.json.JSONDecoder;

    public class Main extends Sprite{
        private var mic:Microphone;
        private var requestor:URLLoader;
        private var waveEncoder:WaveEncoder = new WaveEncoder();
        private var recorder:MicRecorder = new MicRecorder(waveEncoder);
        private var recBar:RecBar = new RecBar();

        private var maxTime:Number = 30;

        private var tween:Tween;
        private var fileReference:FileReference = new FileReference();

        private var tts:WavSound;

        public function Main():void{ 
            trace('recoding'); 

            recButton.visible = false;
            activity.visible = false ;
            godText.visible = false;
            recBar.visible = false;

            mic = Microphone.getMicrophone();
            mic.setSilenceLevel(5);
            mic.gain = 50;
            mic.setLoopBack(false);
            mic.setUseEchoSuppression(true);
            Security.showSettings("2");

            requestor = new URLLoader();

            addListeners();
        }

        private function addListeners():void{
            recorder.addEventListener(RecordingEvent.RECORDING, recording);
            recorder.addEventListener(Event.COMPLETE, recordComplete);
            activity.addEventListener(Event.ENTER_FRAME, updateMeter);

            //accept call from javascript to start recording
            ExternalInterface.addCallback("startRecording", startRecording);
            ExternalInterface.addCallback("stopRecording", stopRecording);
            ExternalInterface.addCallback("sendFileToServer", sendFileToServer);
        }

        //external java script function call to start record
        public function startRecording(max_time):void{
            maxTime = max_time;

            if(mic != null){
                recorder.record();
                ExternalInterface.call("$.audioRec.callback_started_recording");
            }else{
                ExternalInterface.call("$.audioRec.callback_error_recording", 0);
            }
        }

        //external javascript function to trigger stop recording
        public function stopRecording():void{
            recorder.stop();
            mic.setLoopBack(false);
            ExternalInterface.call("$.audioRec.callback_stopped_recording");
        }

        public function sendFileToServer():void{
            finalize_recording();
        }

        public function stopPreview():void{
            //no function is currently available;
        }

        private function updateMeter(e:Event):void{
            ExternalInterface.call("$.audioRec.callback_activityLevel",  mic.activityLevel);
        }

        private function recording(e:RecordingEvent):void{
            var currentTime:int = Math.floor(e.time / 1000);

            ExternalInterface.call("$.audioRec.callback_activityTime",  String(currentTime));

            if(currentTime == maxTime ){
                stopRecording();
            }
        }

        private function recordComplete(e:Event):void{
            preview_recording();
        }

        private function preview_recording():void{
            tts = new WavSound(recorder.output);
            tts.play();

            ExternalInterface.call("$.audioRec.callback_started_preview");
        }

        //function send data to server
        private function finalize_recording():void{
            var _var1:String= '';

            var globalParam = LoaderInfo(this.root.loaderInfo).parameters;
            for(var element:String in globalParam){
                if(element == 'host'){
                    _var1 = globalParam[element];
                }
            }

            ExternalInterface.call("$.audioRec.callback_finished_recording");

            if(_var1 != ''){
                ExternalInterface.call("$.audioRec.callback_started_sending");

                var req:URLRequest = new URLRequest(_var1);
                req.contentType = 'application/octet-stream';
                req.method = URLRequestMethod.POST;
                req.data = recorder.output;

                requestor.addEventListener(Event.COMPLETE, requestCompleteHandler);
                requestor.load(req);
            }
        }

        private function requestCompleteHandler(event:Event){
            ExternalInterface.call("$.audioRec.callback_finished_sending", requestor.data);
        }

        private function getFlashVars():Object{
            return Object(LoaderInfo(this.loaderInfo).parameters);
        }
    }
}

0 个答案:

没有答案