اكتشاف ما إذا كان الملف قد تم تقديمه إلى المتصفح أم لا؟.. كيندا

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

  •  05-07-2019
  •  | 
  •  

سؤال

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

ما أود أن أفعله هو النقر فوق الزر وعرض ملف Load.gif حتى يكتمل مربع الحوار/الملف.

أي أفكار ستكون باردة!

هتافات

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

المحلول

وجعل مجرد توليد RSS العرض النصي الصورة التي تريد (HTML الناتج صورة، ثم المخزن المؤقت الإخراج تدفق والبدء في توليد البيانات). في نهاية توليد البيانات القيام به:

<?php
print '<script>window.location = "http://www.newlocation.com"</script>'

وهذا كل شيء.

نصائح أخرى

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

$("#loading").ajaxStart(function(){
   $(this).show();
});

$("#loading").ajaxStop(function(){
   $(this).hide();
});

$("#feeds").load("feeds.php?id=89734258972347895");

ورمز أعلاه يضع كائن DOM مع المعرف "تحميل" لإظهار وإخفاء عندما شرع في أي طلب غير متزامن وقفها. .load (رابط) يقوم بتحميل محتوى رابط في #feeds شعبة. إذا كنت تقوم بإعداد محتوى التصرف فيها: رأس مرفق مع بي، وسوف بدء تلقائيا نافذة تنزيل ملف، حتى ولو تم تحميلها بشكل غير متزامن إلى شعبة. وهذا ممكن أيضا من دون مسج بالطبع، هناك فقط حفنة من التوافق متصفح جافا سكريبت وليس من السهل كما مجرد الاشتراك في الأحداث ajaxStart وajaxStop لإظهار وإخفاء IMG التحميل الخاص بك.

وجوش

وقبل وضع window.location هل يمكن عرض شعبة الخفية مع اف بك

وانها المدرسة القديمة، ولكن هذا يمكن القيام به بسهولة جدا مع دفع الخادم

<?php
  $separator = "end_of_section_marker";
  header('Content-type: multipart/x-mixed-replace;boundary=$separator');
  print "\n--$separator\n";
  print "Content-type: text/html\n\n";
  // Send placeholder message here
  print "--$separator\n";
  ob_flush();
  flush();
  // Start long processing here
  print "Content-type: text/html\n\n";
  // send data here
  print "--$separator--\n";
?>

وفقط ضبط المحتوى أنواع للبيانات كنت ترسل. $ فاصل يمكن أن يكون أي قيمة طالما أنها لا تظهر في البيانات التي يتم إرسالها.

الطريقة التي استخدمتها في الماضي تعمل مثل هذا ...

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

يحرر:يجب أن تقوم صفحة التحميل بإعادة التوجيه إلى الصفحة الوجهة باستخدام جافا سكريبت (اضبط window.location على عنوان URL المقدم في سلسلة الاستعلام).هذه نقطة مهمة، لأنه إذا قمت بإعادة التوجيه على جانب الخادم، فلن يتم عرض صفحة التحميل.

تحرير 2:إذا كانت صفحة التحميل الخاصة بك عبارة عن ملف php، فيمكنك التحقق من حجم الملف الذي سيتم تنزيله وعرض وقت التنزيل المقدر للمستخدم (مع صورة GIF متحركة "للتحميل")، أو غير ذلك.

  • يجب أن يتم عرض الصفحة الوجهة مع تمكين التخزين المؤقت (استدعاء ob_start() قبل عرض أي محتوى).مع تمكين التخزين المؤقت، لا يتم إرسال أي شيء إلى المتصفح حتى يتم عرض الصفحة بأكملها.وفي الوقت نفسه، سيستمر عرض صفحة التحميل من الخطوة 1.

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

هل من الممكن أن تستخدم إطار iframe لتحميل الخلاصة ثم التحقق من حالة الاستعداد لإطار iframe/المستند باستخدام فاصل زمني؟لذلك ستكون العملية:

  • قم بتحميل نافذة تحتوي على iframe بعرض وارتفاع 100% وloading.gif فوق iframe.
  • قم بتعيين مؤقت للتحقق من خاصية iframe.contentWindow.document.readyState
  • بمجرد اكتمال ReadyState ==، قم بإظهار مربع حوار حفظ الملف.

أحد الجوانب السلبية هو أنه بالنسبة لمعظم المتصفحات، يجب أن يكون ملف PHP على نفس المجال (على IE، يمكنك فقط التحقق من خاصية ReadyState لإطار iframe).

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