سؤال

أنا كنت أفكر رئيس الطلب مع حليقة, أتساءل إذا كان هذا هو الطريق للذهاب ؟

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

المحلول

نعم. منذ الملف هو بعيد، وكنت تعتمد اعتمادا كليا على قيمة رأس Content-Length (إلا إذا كنت تريد تحميل الملف بأكمله). فأنت تريد أن curl_setopt($ch, CURLOPT_NOBODY, true) وcurl_setopt($ch, CURLOPT_HEADER, true).

نصائح أخرى

والحل الأفضل الذي يتبع مبدأ KISS

$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE));
$filesize = $head['content-length'];

انا التخمين باستخدام الضفيرة إلى إرسال رئيس الطلب لطيفة الإمكانية ؛ شيء كهذا قد لا :

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://sstatic.net/so/img/logo.png');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
var_dump($size);

و سوف تحصل على :

float 3438

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


خيار آخر قد تفكر في استخدام filesize...ولكن هذا سوف تفشل :الوثائق الدول (نقلا عن) :

كما PHP 5.0.0, هذه الوظيفة يمكن أن أن تستخدم أيضا مع بعض URL مغلفة.الرجوع إلى قائمة معتمدة بروتوكولات/أغلفة للحصول على قائمة التي مغلفة الدعم الأساسي() الأسرة من الوظائف.

و لسوء الحظ ، HTTP و HTTPS مغلفة, stat() غير معتمد...

إذا كنت تحاول, سوف تحصل على خطأ, مثل هذا :

Warning: filesize() [function.filesize]: stat failed 
    for http://sstatic.net/so/img/logo.png

سيئة للغاية :-(

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

إذا كنت لا تحتاج إلى حل من الرصاص يمكنك القيام به فقط:

strlen(file_get_contents($url));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top