سؤال

ما الكود الذي تحتاج إلى إضافته في PHP ليقوم المتصفح تلقائيًا بتنزيل ملف على الجهاز المحلي عند زيارة الرابط؟

أفكر على وجه التحديد في وظائف مشابهة لتلك الخاصة بمواقع التنزيل التي تطالب المستخدم بحفظ ملف على القرص بمجرد النقر فوق اسم البرنامج؟

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

المحلول

أرسل الرؤوس التالية قبل إخراج الملف:

header("Content-Disposition: attachment; filename=\"" . basename($File) . "\"");
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($File));
header("Connection: close");

@جروم:مثير للاهتمام حول نوع MIME "التطبيق/الثماني تيار".لم أكن على علم بذلك، لقد استخدمت دائمًا "application/force-download" :)

نصائح أخرى

فيما يلي مثال على إرسال ملف pdf.

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
header('Content-Transfer-Encoding: binary');
readfile($filename);

@حفيف لم أجد نوع محتوى التطبيق/فرض التنزيل للقيام بأي شيء مختلف (تم اختباره في IE وFirefox).هل هناك سبب لعدم إرسال نوع MIME الفعلي؟

أيضا في دليل PHP هايلي واتسون نشرت:

إذا كنت ترغب في فرض تنزيل ملف وحفظه، بدلاً من عرضه، تذكر أنه لا يوجد نوع MIME مثل "application/force-download".النوع الصحيح الذي يجب استخدامه في هذه الحالة هو "application/octet-stream"، واستخدام أي شيء آخر يعتمد فقط على حقيقة أنه من المفترض أن يتجاهل العملاء أنواع MIME غير المعروفة ويستخدموا "application/octet-stream" بدلاً من ذلك (المرجع:الأقسام 4.1.4 و4.5.1 من RFC 2046).

أيضا وفقا IANA لا يوجد نوع تطبيق مسجل/فرض التنزيل.

مثال نظيف.

<?php
    header('Content-Type: application/download');
    header('Content-Disposition: attachment; filename="example.txt"');
    header("Content-Length: " . filesize("example.txt"));

    $fp = fopen("example.txt", "r");
    fpassthru($fp);
    fclose($fp);
?>

يعمل الكود الخاص بي مع ملحقات txt,doc,docx,pdf,ppt,pptx,jpg,png,zip وأعتقد أنه من الأفضل استخدام أنواع MIME الفعلية بشكل صريح.

$file_name = "a.txt";

// extracting the extension:
$ext = substr($file_name, strpos($file_name,'.')+1);

header('Content-disposition: attachment; filename='.$file_name);

if(strtolower($ext) == "txt")
{
    header('Content-type: text/plain'); // works for txt only
}
else
{
    header('Content-type: application/'.$ext); // works for all extensions except txt
}
readfile($decrypted_file_path);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top