سؤال

قمت بتعيين رأس بالطريقة التالية:

header('Content-Length: ' . filesize($strPath));

على جهاز الكمبيوتر الخاص بي مع Zenserver، فإنه يعمل بشكل جيد ويمكنني تنزيل ملف بحجم الملف الصحيح. على خادم الإنتاج، سولاريس مع Apache ومجموعة PHP، أحصل على ملف بحجم الملف يساوي الصفر، لذلك ملف فارغ.

هل هناك معلمة التكوين؟ شيء يمكن أن يمنع لتعيين "طول المحتوى: 1222"؟

شكرًا.

الرمز:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

require 'includes/prepend.inc.php';
require __ADMIN_DIR__.'/AdminInfo.php';
$intFile = QApplication::QueryString('fileID');
if($intFile == '') die('Error: missing ID');
$objFile = File::Load($intFile);
$blnRight = false;
$objAdminInfo = new AdminInfo();
if($objAdminInfo->isAdmin()) {
    $blnRight = true;
}
else {
    $objSecMan = new SecurityManager(
        'file:'.$objFile->FileID, 
        $objAdminInfo->getUserID()
    );
    $blnRight = $objSecMan->processResource('view');
}

// if the user can modify and or publish, can even view the file
if(!$blnRight) {
    $blnRight = $objSecMan->processResource('modify');

    if(!$blnRight) {
        $blnRight = $objSecMan->processResource('publish');
    }       
}

//$strPath = __UPLOADS__.DIRECTORY_SEPARATOR.$objFile->FileID;
$strPath = 'subdept.csv';

if (file_exists($strPath) && $blnRight) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$strPath);//$objFile->Filename);
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($strPath));
    ob_clean();
    flush();
    readfile($strPath);
    exit;
}
else {
    die('Restricted access');
}   
?>

عندما أقوم بتعليق الرمز قبل أن يعمل $ Strapath، لذلك يجب أن يكون شيئا في الإطار الدموي. أود أن أرمي كل من CMS بعيدا.

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

المحلول

تحقق من وجود رأس ترميز النقل. إذا تم قطع ترميز النقل، فلن يتم تعيين حقل طول المحتوى

الأسباب المحتملة، هي أن zenserver لا يقوم بالترميز المقطوع، في حين يفعل اباتشي

راجع الروابط التالية للحصول على التفاصيل

http://en.wikipedia.org/wiki/chunked_transfer_encoding.

http://www.w3.org/protocols/rfc2616/rfc2616-sec3.html.

نصائح أخرى

تأكد من أن الملف موجود حقا تحت المسار المحدد (is_file يتحقق من الوجود وإذا كان الملف ملف منتظم) وقابل لقراءة (is_readable) قبل إرسالها إلى العميل. filesize عائدات خاطئة إذا حدث خطأ. لذلك قد يكون سبب قيمة 0 أو قيمة فارغة طول المحتوى.

و كما ferdinand beyer المذكورة بالفعل, ، تأكد من أن البرنامج النصي محمول ويمكنه التعامل مع بيئات مختلفة.

هل أنت متأكد من أن الملف موجود على خادم الإنتاج؟ ربما هي مشكلة حساسية الحالة (على سبيل المثال، "ملف" و "ملف" هي نفسها على Windows، ولكن مختلفة على UNIX)؟ هل يقوم المستخدم بتشغيل Apache / PHP بالوصول إلى القراءة؟

هل تحصل على أي أخطاء إذا قمت بتمكين الأخطاء؟

error_reporting(E_ALL);
ini_set('display_errors', '1');

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

ترميز المحتوى:

يمكنك إضافة .htaccess إعادة كتابة إلى تعطيل GZIP:

RewriteRule . - [E=no-gzip:1]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top