很抱歉这篇文章的长度,但我想提供尽可能多的细节。我是 stackoverflow 的新手,但发现这里的评论过去很有用,所以我希望有人能指出我正确的方向。我们有一个运行 php4.3.9 的 Linux 服务器。
我们的客户可以上传文件,然后点击链接下载。单击该链接会运行一个 php 脚本,该脚本会在数据库中查找文档,然后设置标题、读取文件并下载到客户端计算机。完美运行。我们做了一些编程来动态创建一个 word 文档,我们希望以相同的方式工作,但是当我们将链接添加到我们的站点并单击它时,即使已设置标题,它也只会在浏览器窗口中输出垃圾所以它是一个word文档,应该下载。
在搞砸了太久之后,我决定将我知道的代码用于下载其他文档,并将新文件中的所有内容替换为我知道有效的下载文件中的内容。所以我们创建的新 php 文件被我们清除并替换为下载文件中的代码,所以它们除了 php 文件名外是相同的。我又上传了一遍,还是不行。所以我在同一个目录中有相同的 php 文件指向同一个要下载的文档,在一种情况下它可以工作,而在一种情况下它不能。
然后我使用 web-sniffer.net 查看标头,并找到了有效的文件:
HTTP Response Header
Name Value Delim
Status: HTTP/1.1 200 OK
Date: Wed, 02 Apr 2014 18:50:53 GMT
Server: Apache/2.0.52 (Red Hat)
X-Powered-By: PHP/4.3.9
Content-Disposition: attachment; filename=test.docx
Connection: close
Content-Type: application/vnd.openxmlformats- officedocument.wordprocessingml.document
...对于相同的文件,只是在另一个不起作用的地方...
HTTP Response Header
Name Value Delim
Status: HTTP/1.1 200 OK
Date: Wed, 02 Apr 2014 18:51:15 GMT
Server: Apache/2.0.52 (Red Hat)
X-Powered-By: PHP/4.3.9
Connection: close
Content-Type: text/html; charset=UTF-8
代码是相同的,但是一旦没有发送或替换 Content-Dispostion 和 Content-Type 标头或其他内容,导致内容或(word)文档在浏览器中显示为垃圾,而其他实例下载没有问题???我已经清除了缓存,尝试了不同的浏览器,不同的计算机,结果相同。任何帮助是极大的赞赏!可以肯定的是,这两个地方的代码完全相同。我将它从工作 php 文件复制并粘贴到新的 php 文件中。我什至将链接从有效的地方复制到了无效的地方,然后替换了文件名。关于我应该在哪里寻找的任何建议?
代码:
<?php
function connecttodb($servername,$dbname,$dbuser,$dbpassword){
global $link;
$link=mysql_connect ("$servername","$dbuser","$dbpassword");
if(!$link){die("Could not connect to MySQL");}
mysql_select_db("$dbname",$link) or die ("could not open db".mysql_error());
}
if(isset($_GET['id']))
{
$servername='xxxx';
$dbusername='xxxx';
$dbpassword='xxxx';
$dbname='xxxx';
connecttodb($servername,$dbname,$dbusername,$dbpassword);
$id=$_GET['id'];
$query = "SELECT name, type, size, path FROM upload WHERE fileID = '$id'";
$result = mysql_query($query) or die('Error, query failed');
list($name, $type, $size, $filePath) = mysql_fetch_array($result);
$name=str_replace(","," - ",$name);
header("Content-Disposition: attachment; filename=$name");
header("Content-length: $size");
header("Content-type: $type");
readfile($filePath);
mysql_close($link);
}
?>