PHP تمرير ملف مقبض للمستخدم بحيث تنزيل الملفات وحفظها على جهازهم

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

سؤال

أنا أقوم بتنزيل ملف من خادم آخر. أود أن أدفع هذا الملف إلى مستخدمي بدلا من حفظه إلى خادمي.

بمعنى آخر، قم بتمريرها مقبض الملفات بحيث يمر فقط من خلال الخادم الخاص بي ويحفظ على جهازهم. كيف يمكنني أن أفعل هذا؟ لدي هذا حتى الآن:

$handle = fopen($_GET['fileURL'], 'r');
$filename = stream_get_contents($handle);

كيف يمكنني دفع هذا إلى المستخدم، ربما باستخدام الرؤوس؟

شكرا لأي مساعدة واتجاه.

تعديل

لدي رؤوس:

header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");

انها فقط أنها لا تدفع الرؤوس. أنا فقط أحصل على صفحة فارغة بعد حوالي 15 ثانية التي تبدو وكأنها تنزيل الملف ولكن لا تعطيه لي.

أتمنى لك النصي إرسال الرؤوس على الفور إلى المستخدم كدفق. خروج()؛

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

المحلول

يمكنك تجربة هذا

$filetype = mime_content_type($filename);
header('Content-type: '.$filetype);
header('Content-Disposition: attachment; filename="'.$filename.'"');

تحديث للتحرير الخاص بك:

هل لديك أخطاء معطلة، لأن هذا يبدو وكأنه الرؤوس قد أرسل خطأ بالفعل؟

error_reporting(E_ALL | E_STRICT);

نصائح أخرى

ليس لديك لاستخدام FOPEN () عند استخدام ReadFile ()؛

فقط قم بتضمين اسم الملف داخل ReadFile () مثل هذا:

readfile($_GET['fileUrl']);

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

إليك أمثلة صفيف:

$files = array('file1.jpg', 'file2.png', 'file3.pdf');
//assume $_GET['file_id'] == 0, 1 or 2

if (file_exists($files[$_GET['file_id']]))
    readfile($files[$_GET['file_id']]);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top