2017-02-21 76 views
0

我把一個基本的PHP腳本放在一起,它在執行時應該觸發下載存儲在服務器上的文件。我從http://php.net/manual/en/function.readfile.php注意到使用了readfile函數,並使用了相同的代碼。下載腳本導致404頁面

這用於早期工作,但現在,突然間,我開始取得404頁。下面是我的代碼片段:

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($file)); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($serverPath)); 
readfile($serverPath); 
exit(0); 

當我將調試之間的腳本,我能看到他們,用怪異的數據readfile功能從文件接收一起,因爲文件是PDF。但是,就他們自己而言,這只是給了我一個404頁面,並且沒有任何錯誤/警告。

有人可以請我指出我在代碼中遇到的任何問題,或者我可以查看的任何問題嗎?任何指針都會非常有幫助,因爲我幾乎整天都在通過論壇和調試進行工作,而且還沒有任何解決方案。

編輯:

下面是從服務器接收到的響應頭:

Date: Tue, 21 Feb 2017 23:01:50 GMT 
Server: Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/1.0.1e-fips mod_bwlimited/1.4 
X-Powered-By: PHP/5.4.45 
Expires: Wed, 11 Jan 1984 05:00:00 GMT 
Cache-Control: no-cache, must-revalidate, max-age=0 
Pragma: no-cache 
Content-Disposition: attachment; filename="QM-1.pdf" 
Keep-Alive: timeout=2, max=150 
Connection: Keep-Alive 
Transfer-Encoding: chunked 
Content-Type: application/octet-stream 

編輯2:

所以,我嘗試了本地主機的方法和代碼確實工作在我的本地環境中完美無瑕。兩個位置的PHP版本都是相同的。除此之外,我應該看看服務器級別以查找此行爲背後的原因的任何指針?

+0

嘗試將您的Content-Type更改爲application/pdf。也許問題在這裏。此外,我認爲這個鏈接是類似於你的情況:http://stackoverflow.com/a/10088979/6066986 http://stackoverflow.com/a/13570935/6066986 – Grynets

+0

@Grynets嘗試PDF選項,也試過文件選項,兩者都沒有成功。 – Prateek

+0

你的服務器有什麼變化嗎?也許有些權限? – Grynets

回答

0

您是否檢查過該文件是否存在並且可讀?考慮使用file_existsis_readable等功能來確保您的代碼按計劃運行。

一定還要檢查服務器返回HTTP 404錯誤時得到的頭文件,甚至可能無法訪問您的代碼,並且該錯誤可能在其他位置。

+0

已經嘗試過這些功能,但沒有成功。此外,我手動檢查,並存在文件。如果我通過直接URL訪問該文件,它可以正常工作。我添加了從服務器收到的標題。 – Prateek