urlrequest أو loader ببساطة لا تعمل على بعض أجهزة الكمبيوتر؟

StackOverflow https://stackoverflow.com/questions/3553550

سؤال

لذلك قد تكون مشكلتي أكبر قليلاً من ذلك ، لكنني لست متأكدًا. أقوم بإنشاء عارض صور فلاش مخصص لعميل يقوم بتحميل الصور ديناميكيًا باستخدام كائنات loader. يستغرق اسم المجلد في دليل محدد على الخادم ويستدعي صفحة PHP (باستخدام urlrequest) للحصول على محتويات قابلة للتطبيق للمجلد. ثم يقوم بتحميله من تلك الصفيف.

إليكم المشكلة: إنه يعمل بشكل جيد على الجهاز الخاص بي وكل جهاز قمت باختباره عليه ، لكنه لا يعمل على جهاز موكلي أو بعض آلات عملائه. لا يبدأ شريط المحمل الموجود في أسفل الشاشة في ملء ، مما يعني أن الصور لا تبدأ في التحميل ، ويشير شريط الحالة إلى أنه يستمر في انتظار الخادم ، ولكنه لا ينتهي أبدًا الانتظار. هذا متسق على جهاز واحد ، ولكنه يختلف عبر الآلات.

لقد أضفت تشخيصات (فئة مخصصة قمت بها لتتبع بعض Vars وجمع الأخطاء) إلى الشيء لالتقاط أي أخطاء ، لكنه لا يوضح شيئًا على جهاز موكلي. لقد أضفت رمز فحص إصدار الفلاش ، وبالتالي فإن إمكانية الحصول على إصدار أقل تعبثها ...

أعتقد أن سؤالي هو ، هل هناك أي شيء (أمان ، بيئة ، إلخ) يمكن أن أغفله ولا يسمح لكائنات الطلب أو أي شيء للعمل على أجهزة معينة ؟؟ لقد تم تمزيق شعري في محاولة لمعرفة هذا!

الكود الخاص بي (الأقسام ذات الصلة):

    public static const LOADLIMIT:int = 4;

    public var paramObj:Object;
    private var imageRequests:Vector.<URLRequest>;
    private var loaderObj:Vector.<Loader>;
    private var nextToLoad:int = -1;

    //...

    public function Player(){
        //...
        paramObj = loaderInfo.parameters;
            if (!paramObj.root) paramObj.root = "http://site.com/images/";
            paramObj.imgloc = paramObj.imgloc;
            var res = bootstrapImages(paramObj.imgloc);
            if (res is String){
                loadErrorMsg.text = res;
                loadErrorMsg.visible = true;
                log.log(res);
            }
        //...
    }

    private function bootstrapImages(imgloc:String):*{
        try{
        if (!imgloc) return "No image location specified"; 

        var req:URLRequest = new URLRequest(paramObj.root+"getdirlist.php?name="+imgloc);
        var loader:URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, directoryLoaded);
        loader.addEventListener(IOErrorEvent.IO_ERROR, function(ex:IOError){
            loadErrorMsg.text = "Error retreiving album data.";
            loadErrorMsg.visible = true;
            log.log(ex);
        });
        loader.load(req);
        } catch (ex:Error){
            log.log(ex); throw ex;
        }
    }

    private function directoryLoaded(e:Event){
        try{
        //directory will come down as a json array
        trace(e.target.data);
        try {
            var items:Array = JSON.decode(e.target.data);
        } catch (ex:Error){
            trace (ex.getStackTrace());
            loadErrorMsg.text = "Error parsing album data.";
            loadErrorMsg.visible = true;
            log.log(ex);
            return;
        } 

        if (items.length == 0){
            loadErrorMsg.text = "Invalid album name";
            loadErrorMsg.visible = true;
            log.log("Items length is 0.");
            return;
        }

        imageRequests = new Vector.<URLRequest>();
        loaderObj = new Vector.<Loader>();
        for each(var item:String in items){
            imageRequests.push(new URLRequest(paramObj.root+"coffeeimages/"+paramObj.imgloc+"/"+item));
            loaderObj.push(null);
        }

        //...show UI...

        for (var i:int = 0; i < LOADLIMIT; i++){
            imageLoaded(null);
        }
        } catch (ex:Error){
            log.log(ex); throw ex;
        }
    }

    private function imageLoaded(e:Event){
        try{
        //if this was called as a result of the load event, start the slideshow! :D
        if (e != null && e.target != null) {
            //stage.addChild((e.target as LoaderInfo).loader);
            trace(loaderObj[0]);
            if (loaderObj[0] != null && //if the first image is loaded
                loaderObj[0].contentLoaderInfo.bytesLoaded >= loaderObj[0].contentLoaderInfo.bytesTotal){ 
                trace(loaderObj[0].contentLoaderInfo.bytesLoaded, loaderObj[0].contentLoaderInfo.bytesTotal);
                loadErrorMsg.visible = false;
                playSlideshow(true);
            }
        }
        trace((e)?e.target:null, loaderObj);
        nextToLoad++;
        if (nextToLoad >= imageRequests.length) return;

        var r:URLRequest = imageRequests[nextToLoad];
        var l:Loader = new Loader();
        l.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
        l.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(ex:ErrorEvent){
            loadErrorMsg.text = "Error parsing image data.";
            loadErrorMsg.visible = true;
            log.log(ex);
        });
        l.load(r);
        loaderObj[nextToLoad] = l;
        log.addObjectWatch(l);
        } catch (ex:Error){
            log.log(ex); throw ex;
        }
    }

ايضا، هذا اللاعب يعيش على الموقع. Ctrl+Alt+Home يجلب لوحة التشخيص الخاصة بي. من فضلك قل لي ما إذا كان هذا لا يعمل من أجلك أيضًا ، لذلك يمكنني أن أكون أكثر قلقًا بشأن هذا ...:/ شكرًا.

يحرر: لقد أضفت المزيد من معلومات التصحيح. تبين أنه على أجهزة الكمبيوتر التي لا تستطيع تحميلها ، فإنها تحصل على حالة HTTP 0 يتم إرجاعها عند محاولة وضع معلومات الألبوم. لا فكرة لدي عن معنى ذلك...

هل كانت مفيدة؟

المحلول

لذلك ، كانت المشكلة مسألة عنوان URL طلبها ...

كان موكلي يكتب "www.site.com" ، بينما كان الرمز الخاص بي يطلب "موقع.com". إلى Adobe ، هذا هو طلب موقع متقاطع ، و غير مسموح بشكل افتراضي. أحد الحلول (وربما الأسهل) هو إضافة ملف يسمى "crossdomain.xml" إلى المجلد الجذري للموقع. يبحث فلاش عن هذا الملف عند تقديم طلب. مثال واحد يعمل بالنسبة لي هو على النحو التالي:

//crossdomain.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">

<cross-domain-policy>
    <allow-access-from domain="*.site.com" secure="false"/>
</cross-domain-policy>

تتضمن الحلول الأخرى إعادة توجيه إلى أحدهما ("site.com" يعيد التوجيه إلى "www.site.com") ، أو القيام بإعادة كتابة عنوان URL ، أو الحصول على عنوان URL الذي دخلوه.

نصائح أخرى

بعض الأشياء التي لاحظتها ، أنت تستمع فقط لـ Event.complete و ioerrorevent.io_error. أقترح أيضًا الاستماع إلى httpstatusevent.http_status ، event.Open ، على الرغم من أنني لم أضفها في ، فقد يقدمون معلومات مفيدة إذا كنت لا تزال لا تصل إلى أي مكان.

يجب ألا تحتاج إلى كائن loadercontext إذا كنت تقوم فقط بتحميل الصور وعدم الوصول إلى محتواها ، بحيث لا يكون (الأمان) مشكلة حقًا. يجب عليك بالتأكيد فصل المنطق الخاص بك في التحميل الخيالي بحيث لا يكون البادئ ومعالج الانتهاء لكل من اللوائح الخاصة بك.

على أي حال ، لا توجد فكرة إذا كان هذا مفيدًا لك ، لكنني جعلت الكود الخاص بك أكثر قابلية للقراءة وأعدت صياغة بعض الأشياء التي لم تكن منطقية.

public static const LOADLIMIT:int = 4;

private var paramObj:Object;
private var imageRequests:Vector.<URLRequest>;
private var loaderObj:Vector.<Loader>;
private var nextToLoad:int = -1;

public function Player(){
    paramObj = loaderInfo.parameters;

    //what is this all about, your backup URL is useless?
    if (!paramObj.root) {
        paramObj.root = "http://site.com/images/";
    }

    var res = bootstrapImages();
    if (res.length > 0){
        loadErrorMsg.text = res;
        loadErrorMsg.visible = true;
        //log.log kills me
        log.log(res);
    }
}

private function bootstrapImages():String {
    try {
        var req:URLRequest = new URLRequest(paramObj.root + "getdirlist.php?name=" + paramObj.imgloc);
        var loader:URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, directoryLoaded);
        loader.addEventListener(IOErrorEvent.IO_ERROR, dataIOError);
        loader.load(req);
    } catch (ex:Error) {
        log.log(ex);
    }
    return "";
}

private function directoryLoaded(e:Event):void{
    trace(e.target.data);
    try {
        var items:Array = JSON.decode(e.target.data);
    } catch (ex:Error){
        trace (ex.getStackTrace());
        loadErrorMsg.text = "Error parsing album data.";
        loadErrorMsg.visible = true;
        log.log(ex);
        return;
    } 

    if (items.length == 0){
        loadErrorMsg.text = "Invalid album name";
        loadErrorMsg.visible = true;
        log.log("Items length is 0.");
        return;
    }

    imageRequests = new Vector.<URLRequest>();
    loaderObj = new Vector.<Loader>();
    for each(var item:String in items){
        imageRequests.push(new URLRequest(paramObj.root+"coffeeimages/"+paramObj.imgloc+"/"+item));
        loaderObj.push(new Loader());
    }

    for (var i:int = 0; i < LOADLIMIT; i++){
        loadNextImage();
    }
}

private function loadNextImage():void {
    nextToLoad++;
    if (nextToLoad < imageRequests.length) {
        loaderObj[nextToLoad].contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
        loaderObj[nextToLoad].contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, dataIOError);
        try {
            loaderObj[nextToLoad].load(imageRequests[nextToLoad]);
        }
        catch (e:Error) {
            log.log(ex);
        }
        log.addObjectWatch(loaderObj[nextToLoad]);
    }
}

private function dataIOError(e:IOError):void {
    loadErrorMsg.text = "IOError: " + e.errorID + " - " + e.name + ", " + e.message;
    loadErrorMsg.visible = true;
    log.log(ex);
}

private function imageLoaded(e:Event){
    //Start the slideshow if the first image has loaded
    loadNextImage();
    if (e.target == loaderObj[0]) {
        trace(loaderObj[0].contentLoaderInfo.bytesLoaded, loaderObj[0].contentLoaderInfo.bytesTotal);
        loadErrorMsg.visible = false;
        playSlideshow(true);
    }
}

يحرر: قد ترغب ببساطة في إلغاء رمز التحميل الخاص بك بالكامل وبدلاً من ذلك استخدام محمل كبير

يعجبني حل CrossDomain.xml المذكور أعلاه ، لكن كان لدينا مشكلة مماثلة على أجهزة الكمبيوتر الخاصة بعميلنا. وكانت المشكلة هي أن المكونات الإضافية لمستعرض AdBlocker كانت تمنع urlrequest من ActionScript. نحن نجد حاليًا حلًا لهذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top