سؤال

أحاول استخدام التعليمات البرمجية التالية لإنشاء ملف مضغوط من دليل وتخدم المستخدم عبر http تحميل:

 // write the file
file_put_contents($path . "/index.html", $output);

// zip up the contents
chdir($path);
exec("zip -r {$course->name} ./");

$filename = "{$course->name}.zip";

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' .urlencode($filename));
header('Content-Transfer-Encoding: binary');

readfile($filename);

وأنا قادرة على إنشاء ملف مضغوط ولكن تنزيله على http لا يعمل.إذا كنت تحميل ملف مضغوط التي تم إنشاؤها باستخدام عميل ftp ثم ماك Stuffit Expander unzips الملفات على ما يرام, ولكن إذا كنت تحميل البرنامج عبر http ، ماك unzipper يخلق حلقة لا نهاية لها.ما أعنيه بهذا هو يقول الملف تحميل يسمى course.zip ثم تفك ضغطه الملف يعطي الحال.الرمز البريدي.cpgz وحيويي هذا الملف يعطي course.zip مرة أخرى..وعلى.

أي شخص لديك أي أفكار ؟

وذلك بفضل!

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

المحلول

  1. إعادة فتح سوستة في كل مرة يتم طلب ليس فكرة جيدة.محاولة القيام بذلك فقط إذا كان الملف المضغوط غير موجود بالفعل.

  2. إذا هو المتقلبة أو ملف واحد فقط ملف صغير كنت ترغب في نقل مضغوط ، ob_start('ob_gzhandler') بدلا من ذلك ، simplier, أصغر, منظف.الملف نقلها مضغوط ، ولكن يتم حفظها في شكلها الأصلي من قبل العميل.

  3. تحديد رأس طول محتوى اللازمة للسماح downloader أن أعرف نهاية الملف ، مما يتيح مراقبة التقدم ، والكشف عن الفساد من ملف وتجنب تعليق HTTP الدورة (في حالة اتصال في المحافظة على الحياة واسطة), ربما لعدم وجود هذا الرأس هو جذر المشكلة.

نصائح أخرى

وكان لي هذه المشكلة واتضح زيارتها تحميل ملف مضغوط خط جديد إدراجها في البداية.

وحلها باستخدام وظائف ob_clean وتدفق

    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=".basename($archive_file_name));
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize($archive_file_name));
    ob_clean();
    flush();
    echo readfile("$archive_file_name");

وكما اقترح karim79 ، وسوف أضع تعليقي كإجابة: ماذا يحدث إذا قمت بتغيير نوع MIME من التطبيق / الثماني تيار إلى التطبيق / البريدي؟

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

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

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

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