الحصول على أحجام ملفات متعددة لبرنامج التحميل المسبق

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

  •  09-06-2019
  •  | 
  •  

سؤال

حسنًا، لدي حاليًا ملف SWF الخاص بي وهو يضغط على ملف php الذي سيبحث عن جميع الملفات التي أحددها له، ويجمع أحجامها معًا ويعيد أحجامها المجمعة كرقم واحد.ثم أستخدم هذا الرقم مع مستمع ProgressEvent لتحديد النسبة المئوية الحالية للملفات التي يتم تنزيلها لهذا القسم المعين من موقع الويب.

أليس كذلك؟حسنًا، أصبح الآن استخدام ملف PHP هذا غير وارد وأنا أحاول القيام بكل شيء داخل ملف SWF بدلاً من جعله يصل إلى برنامج نصي خارجي للحصول على الأرقام التي أحتاجها.

هل هناك أي طريقة جيدة للحصول على حجم الملف قبل أن أبدأ بتحميله إلى الفلاش؟أحتاج حقًا إلى أن يكون برنامج التحميل المسبق بمثابة أداة تحميل مسبق بنسبة 0 إلى 100%، لذا أحتاج إلى إجمالي عدد البايتات التي سأقوم بتنزيلها قبل أن يبدأ فعليًا.

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

هل هناك حل أفضل لهذه المشكلة دون الخروج عن الفلاش لمعرفة حجم تلك الملفات؟

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

المحلول

يمكنك إجراء طلب HTTP HEAD إلى الخادم للحصول على الملفات.سيؤدي هذا إلى إرجاع معلومات الرأس (بما في ذلك حجم الملف) ولكن ليس الملف الفعلي.يمكنك بعد ذلك تقديم طلب GET لتحميل الملفات.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

(راجع القسم 9.4 الرأس)

ما سأفعله على الأرجح هو شريط تقدم من مستويين (مع شريطي تقدم).يظهر أحدهما التقدم الإجمالي (من 0 إلى 100%) ويظهر التقدم لكل ملف (عند تنزيل كل ملف).

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

غرف مايك

Mesh@adobe.com

نصائح أخرى

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

var socket : Socket = new Socket( );
socket.addEventListener( Event.CONNECT, connectHandler );
socket.addEventListener( ProgressEvent.SOCKET_DATA, dataHandler );
socket.connect( "yourserver.com", 80 );

function connectHandler( event : Event ) : void {
    var headers : String = "HEAD yourfilename.ext http/1.1\r\n";
    headers += "Host: yourserver.com\r\n";
    headers += "\r\n\r\n";
    socket.writeUTFBytes( headers );
    socket.flush( );
}

function dataHandler( event : ProgressEvent ) : void {
    trace( "Received headers\n" );
    trace( socket.readUTF( socket.bytesAvailable ) );
}

إذا كان من الضروري للغاية التحكم في كيفية تحميل الملفات، فأعتقد أن اقتراح مايك تشامبرز بتقديم طلب HTTP HEAD هو الحل الأمثل.

ومع ذلك، ما لم يكن هناك سبب وجيه لعدم القيام بذلك، فسأبدأ ببساطة في تحميل جميع الملفات مرة واحدة وأحصل على أحجام ملفاتي من طريقة getBytesTotal لكل ملف.نظرًا لأن Flash يحصل على حزمة الشبكة الخاصة به من المتصفح، فإن عدد الملفات المحملة فعليًا بشكل متزامن سيتوافق مع إعدادات المتصفح (التي يمكن تحديدها من قبل المستخدم).

ما يلي هو فقط للأغراض سبيل المثال.في حالة حقيقية، لن أستخدم Timer، سيكون لدي مصفوفة أو كائن XML للتكرار من خلال حلقة for، بغض النظر عن أنها تعمل بشكل رائع وبشكل أساسي بمجرد وصولك إلى نهاية الحلقة (على سبيل المثال.if(i == (length - 1)) اطلب منه استدعاء الوظيفة التي تبدأ التحميل المسبق الفعلي الآن بعد أن حصلنا على الإجمالي.الآن نقوم بالتكرار عبر المصفوفة أو كائن XML مرة أخرى، ولكن هذه المرة نقوم بذلك فقط بمجرد تحميل كل أصل، وليس في حلقة for.يمكن لهذه الطريقة غير المتزامنة بعد ذلك الجلوس هناك ومقارنة كمية البيانات التي تم تحميلها وتقسيمها على الإجمالي الذي تم العثور عليه مسبقًا مما يمنحك النسبة المئوية الخاصة بك.

var totalBytes:Number = 0;

var loader:Loader = new Loader();
var request:URLRequest = new URLRequest();
request.url = 'badfish.jpg';

var timer:Timer = new Timer(200);
timer.addEventListener(TimerEvent.TIMER, onTimer);

function onTimer(e:TimerEvent)
{
    loader.load(request);
    loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
}
function onProgress(e:ProgressEvent):void
{
    totalBytes+=e.bytesTotal;
    trace(e.bytesTotal,totalBytes);
    loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
}

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