php - एक्सएसएफ़फ़ाइल डाउनलोड में 0 बाइट्स हैं




yii x-sendfile (2)

सुनिश्चित करें कि फ़ाइल के पथ को सेवा प्रदान करना उसी पथ है जिसे आप XSendFilePath निर्देश पर httpd.conf या h ttpd-vhosts.conf पर उपयोग कर रहे हैं

या: क्या आप सार्वजनिक फ़ोल्डर के बाहर फाइल भेज रहे हैं? यदि ऐसा है तो एक्सएसएंडफ़ाइल एलोवएबॉव ऑन अपाचे कॉन्फ़िग को जोड़ें

LAMP स्टैक पर, मुझे एक्सएसएफ़फ़ाइल काम करने के लिए नहीं मिल सकता है समस्या यह है कि डाउनलोड में 0 बाइट्स हैं।

यह सुनिश्चित करने के लिए कि मेरे पास xSendFile स्थापित है, मैंने इसे अपने .htaccess फ़ाइल में जोड़ा है:

<IfModule mod_xsendfile.c>
  SetEnv MOD_mod_xsendfile 1
</IfModule>

(मैं इसे apache_get_modules() साथ नहीं परीक्षण कर सकता क्योंकि मैं PHP को fastCGI के रूप में चला रहा हूं।)

मैं तो निम्नलिखित PHP कोड है:

 if (1 != getenv('MOD_mod_xsendfile'))
    {
        echo 'mod_xsendfile is not installed';
    }
    else
    {
        $path = '/home/infar/';
        $file = 'hello.txt';
        if (file_exists($path.$file) && strlen($path.$file)>1)
        {
            if (true) // change to false to go around Yii
            {
                Yii::app()->request->xSendFile($path.$file,array(
                    'saveName'=> 'hello.txt',
                    'mimeType'=> 'plain/text',
                    'terminate'=> true,
                ));
            }
            else
            {
                //set proper Content-Type
                header('Content-Type: plain/text');
                //force download box with the filename hello.txt
                header('Content-Disposition: attachment;filename=hello.txt');
                header('X-Sendfile: $path.$file');
                exit;      
            }  
        }
        else
        {
            echo 'file not found at: '.$path.$file;
        }
    }

अपेक्षित के रूप में यह कोड चलता है; जिस से मैंने निष्कर्ष निकाला है कि xSendFile स्थापित होना चाहिए और / या सक्षम होना चाहिए। मैं तो Yii xSendFile और सादे PHP के साथ दोनों के साथ इस स्क्रिप्ट को चलाता हूं। दोनों ही मामलों में डाउनलोड विंडो खुलती है, लेकिन हमेशा 0 बाइट्स के साथ।

मुझे और कुछ नहीं सुझ रहा। मैं क्या गलत कर रहा हूं?

पूर्ण प्रकटीकरण के हित में, यहां httpd.conf का प्रासंगिक हिस्सा है:

<IfModule mod_xsendfile.c>
    XSendFile on
    XSendFilePath /home/infar
</IfModule>

संपादित करें:

आउटपुट संपीड़न बंद है:

ini_get("zlib.output_compression"); // returns "Off"

क्रोम मुझे निम्नलिखित शीर्षलेख दिखाता है:

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Disposition:attachment;filename=hello.txt
Content-Length:0
Content-Type:plain/text
Date:Sun, 23 Mar 2014 18:22:49 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=2, max=100
Pragma:no-cache
Server:Apache
X-Sendfile:/home/infar/hello.txt

26 मार्च 2014 को अपडेट करें

गब्रिएलीविइरा सुझाव का परीक्षण करते समय, मैंने निम्नलिखित खोज की:

header('Content-Type: plain/text');
header('Content-Disposition: attachment;filename=hello.txt');
header('X-Sendfile: '.$path.$file); // $path.$file outside quotes
header('Content-Length: '.filesize($path.$file)); // Filesize
echo '12345678901234567890';
exit;  

यह स्क्रिप्ट (जहां मैंने echo '12345678901234567890'; को जोड़ लिया है) ने निम्न 16 वर्ण स्ट्रिंग 1234567890123456 युक्त फ़ाइल के लिए एक डाउनलोड का उत्पादन किया। 16 अक्षर hello.txt . hello.txt के hello.txt मिलान करता है। तो ऐसा लगता है कि हम निम्न निष्कर्ष निकाल सकते हैं

  1. सामग्री-लम्बाई और फाईलिस को सही ढंग से संभाला जाता है
  2. या तो X-SendFile फ़ाइल नहीं मिल रहा है, या:
  3. X-SendFile फ़ाइल को संसाधित नहीं करता है।

वास्तव में, X-SendFile की टिप्पणी करना, जैसे:

// header('X-Sendfile: '.$path.$file);

एक ही परिणाम पैदा करता है; X-Sendfile हेडर निष्पादित करने से अयोग्य


इस भाग के शुद्ध PHP संपादन से परीक्षण करें:

header('Content-Type: plain/text');
//force download box with the filename hello.txt
header('Content-Disposition: attachment;filename=hello.txt');
header('X-Sendfile: '.$path.$file); // $path.$file outside quotes
header('Content-Length: '.filesize($path.$file)); // Filesize

संपादित करें:

बदलाव का प्रयास करें:

header('application/octet-stream');