فلاش، والوصول إلى totalBytes قبل تحميل الملف فعلا

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

  •  03-07-2019
  •  | 
  •  

سؤال

وايم تبحث عن وسيلة بسيطة للعثور على أحجام الملفات من الملفات ط تخطط لتحميل دون تحميلها حتى الان. أنا صنع في الأساس مجموعة من الملفات التي تحتاج إلى تحميلها وسيكون من المفيد جدا إذا كان بإمكاني تحديد يوم مسبقا كيف كبيرة الحمولة الكلية ستكون.

والكائن محمل في ومضة له خاصية totalBytes، ولكن هذا سوف فقط إرجاع قيمة عند تحميل بالفعل ملف.

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

المحلول

حسب تحميلها، هل يعني تحميلها تماما، أو مع عدم وجود مكالمة الحمل؟ إذا مكالمة الحمل مقبولة، يمكن أن يكون مفيدا يلي. حالة التقدم يعطي إجمالي حجم البيانات الواردة على اطلاق النار اولا. نحن مجرد السماح لإطلاق النار حدث تقدم معين، أخذ القيمة الإجمالية لهذا البند التحميل الحالية وأضيف أن لدينا متغير _Total الخاصة. نواصل هذا حتى dataprovider لدينا (مجموعة، أكس، الخ) فارغ. في نهاية لديك مبلغ من جميع الأصول المجاميع الخاصة بك.

package
{
    import flash.display.Sprite;
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.URLLoader;
    import flash.URLRequest;

    public class ExampleDocumentClass extends Sprite
    {
        private var _urlLoader:URLLoader;
        private var _loader:Loader;
        private var _request:URLRequest;
        private var _total:Number;
        private var _array:Array;

        public function ExampleDocumentClass():void
        {
            if(stage) _init;
            else addEventListener(Event.ADDED_TO_STAGE, _init);
        }
        private function _init(e:Event = null):void
        {
            _array = [{type:"nonDisplay", path:"path/to/file"},{type:"display", path:"path/to/file"}];
            _urlRequest = new URLRequest();

            //Non display asset
             _urlLoader = new URLLoader();
            _urlLoader.addEventListener(ProgressEvent.PROGRESS, _onProgress);

            //Display asset
            _loader = new Loader();

            loadAsset();
        }
        private function loadAsset():void
        {
            if(_array.length > 0)
            {
                var pObj:Object = _array[0];
                if(pObj.type == "nonDisplay")
                {
                    loadNonDisplayAsset(pObj.path);
                }
                else
                {
                    loadDisplayAsset(pObj.path);
                }
                //Remove this item from the array;
                _array.shift();
            }
        }
        private function loadNonDisplayAsset(pAsset:String):void
        {
            _urlRequest.url = pAsset;
            _urlLoader.load(_urlRequest);
        }
        private function loadDisplayAsset(pAsset:String):void
        {
            _urlRequest.url = pAsset;
            _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, _onProgress);
            _loader.load(_urlRequest);
        }
        private function _onProgress(e:ProgressEvent):void
        {
            _total += e.bytesTotal;
            _loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, _onProgress);
            _urlLoader.removeEventListener(ProgressEvent.PROGRESS, _onProgress);
        }
    }
}

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

نصائح أخرى

وليس هناك طريقة للحصول على حجم ملف قبل من Actionscript 3. ومن شأن حل سهل أن يكون لإضافة برنامج نصي صغير إلى الخادم الذي يقوم بمسح لجميع الملفات ويعود أسمائهم وحجمها إلى فرنك سويسري (كما JSON أو XML أو أيا كان).

وليس هناك طريقة للقيام بذلك في أكشن. ستحتاج بعض التعليمات البرمجية جانب الملقم للقيام بذلك. يمكنك إنشاء الأسلوب الذي يأخذ اسم الملف وإرجاع مجموع بايت.

وأنا لا أعرف كيف كنت تفعل هذا مع أكشن (أنا لا جورو) لكن الأول تخميني هو استخدام برنامج نصي PHP (أو أي لغة برمجة أخرى من اختيارك) للحصول على أحجام الملفات وعودة القيم.

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

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

وكانت إحدى المشاكل الرئيسية التي واجهت في رحلتي إلى تحميلها مسبقا الجنة التي فلاش بلاير يبدو أن تسفر عن نتائج غير متسقة فيما يتعلق ملف حجم! حتى لو حملت بالضبط نفس الملفات مرتين سوف فلاش تخبرني أنها كانت أحجام مختلفة ... في بعض الأحيان.

وهذا تسبب أيضا مشاكل مع أسلوب بديل (PHP)، منذ النصي PHP ستنتج (على ما يبدو) دقيقة النتائج حجم الملفات التي تتعارض مع تلك التي تنتجها فلاش، مما تسبب محمل لي للذهاب إلى 85٪ أو 128٪، اعتمادا على التخزين المؤقت والمزاج فلاش في: /

وأنا ألغت كلتا الطريقتين لصالح فئة لطيفة تسمى الأكبر محمل ، والذي يسمح لتحميل قائمة الانتظار وتتبع التقدم من عناصر متعددة، وأكثر من ذلك بكثير: D

وفقط أن ندرك أنه سيزيد حجم ملف فرنك سويسري بشكل ملحوظ ... كيف السخرية

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