سؤال

لدي أرشيف TAR على الخادم الذي يجب تنزيله من خلال PHP. هذا هو الرمز الذي استخدمته:

$content=file_get_contents($tar);
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=$tar");
header("Content-Length: ".strlen($content));    
unlink($name);
die($content);

تم تنزيل الملف لكنه مكسور ولا يمكن فتحه. أعتقد أن هناك خطأ ما في الرؤوس لأن الملف الموجود على الخادم يمكن أن يكون مفتوحًا دون مشاكل. هل تعرف كيف يمكنني حل هذه المشكلة؟

تحديثلقد حاولت طباعة iFrame مثل هذا:

<iframe src="<?php echo $tar?>"></iframe>

ويعمل التنزيل ، لذلك أنا متأكد من أن هناك شيء مفقود في الرؤوس.

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

المحلول

لقد استخدمت هذا الرمز عندما اضطررت إلى القيام بذلك:

function _Download($f_location, $f_name){
 header('Content-Description: File Transfer');
 header('Content-Type: application/octet-stream');
 header('Content-Length: ' . filesize($f_location));
 header('Content-Disposition: attachment; filename=' . basename($f_name));
 readfile($f_location);
 }

_Download("../directory/to/tar/raj.tar", "raj.tar");
//or
_Download("/var/www/vhost/domain.com/httpdocs/directory/to/tar/raj.tar", "raj.tar");

جرب ذلك.

نصائح أخرى

لا تستخدم file_get_contents() وثم echo أو print لإخراج الملف. هذا يحمل المحتويات الكاملة للملف في الذاكرة. يمكن أن يتجاوز/ملف كبير البرنامج النصي الخاص بك memory_limit وقتل النص.

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

لذلك ، ينتهي بك الأمر:

$tar = 'somefile.tar';
$tar_path = '/the/full/path/to/where/the/file/is' . $tar;
$size = filesize($tar_path);

header("Content-Type: application/x-tar");
header("Content-Disposition: attachment; filename='".$tar."'");
header("Content-Length: $size");    
header("Content-Transfer-Encoding: binary");

readfile($tar_path);

إذا كان ملف TAR الخاص بك بالفعل gzipped ، فاستخدم "Application/X-GTAR" بدلاً من ذلك.

إذا كان الملف لا يزال تالفًا بعد التنزيل ، فقم ببعض التحقق من جانب العميل:

  1. هو الملف الذي تم تنزيله 0 بايت ، ولكن يبدو أن عملية التنزيل تستغرق وقتًا أطول بكثير مما سيستغرق نقل 0 بايت ، فهذا شيء يمنع التنزيل من جانب العميل. ماسحة الفيروس؟ حصان طروادة؟
  2. هل الملف الذي تم تنزيله موجود جزئيًا ، ولكنه أصغر من الأصل؟ شيء ما قتل النقل قبل الأوان. جدار الحماية الزائد؟ تنزيل مدير يوم سيء؟ إخراج التخزين المؤقت النشط على الخادم وآخر دلو المخزن المؤقت لا يتم مسحه بشكل صحيح؟
  3. هل الملف الذي تم تنزيله بنفس حجم الأصلي؟ قم بفحص MD5/SHA1/CRC على كلا النسختين. إذا كانت هذه هي نفسها ، فإن هناك خطأ ما في فتح التطبيق ، وليس الملف نفسه
  4. هل الملف الذي تم تنزيله أكبر من الأصل؟ افتح الملف الموجود في Notepad (أو شيء أفضل مثل Notepad ++ الذي لا يستغرق سنوات لفتح Fils Big) ومعرفة ما إذا كانت أي رسائل تحذير PHP ، أو بعض المساحة البيضاء غير المرئية التي لا يمكنك رؤيتها في البرنامج النصي الخاص بك يتم إدراجها في التنزيل في البداية أو نهاية الملف.

جرب شيئًا مثل ما يلي:

$s_filePath = 'somefile.ext';
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'. s_filePath.'"');
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
header('Cache-control: private');
header('Pragma: private');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header("Content-Length: ".filesize($s_filePath));

$r_fh = fopen($s_filePath,'r');
while(feof($r_fh) === false) {
    $s_part = fread($r_fh,10240);
    echo $s_part;
}
fclose($r_fh);
exit();

استخدم نوع المحتوى: التطبيق/الثماني الثماني أو نوع المحتوى: التطبيق/X-GTAR

تأكد من أنك لا تردد أي شيء ليس هو إخراج الملف. اتصل بـ OB_CLEAN () قبل الرؤوس

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