2017-02-21 79 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