当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

使用php强制下载空文件

admin 126℃
最终目标是让用户下载一个.csv文件。现在我正在测试下载一个简单的文本文件:test.txt。这个文件中唯一的东西是单词'test'。

这是下载文件的html代码。php

Test file: <a href='test.php?file=test.txt'>Test.txt</a>

test.php的代码:

if(!(empty($_GET["file"])))
{
    $file_name = $_GET["file"];
    $path = "path/to/file";
    $fullPath = $path . $file_name;

    if(ini_get('zlib.output_compression'))
      ini_set('zlib.output_compression', 'Off');

    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: inline; attachment; filename=\"$file_name\"");
    header("Content-Type: text/plain");
    header("Content-Transfer-Encoding: binary");
    readfile($fullPath);
}

我已经尝试了上面标题的变体,添加了更多的标题,删除了其他标题。以上内容似乎是本网站上最常见的推荐内容。

我也尝试过更改

header("Content-Type: text/plain");

header("Content-Type: text/csv");

得到相同的结果:空的.txt或.csv文件。

当我从服务器直接打开文件(文件浏览器)时,这些文件不是空的。我已经检查了这些文件的权限,它们都是644,所以整个世界至少可以读取这些文件。目录是777。

在apache服务器上是否有我需要指定的配置,该配置可能不存在,或者我是否遗漏了上述内容。

谢谢你的帮忙!

在大多数情况下,路径是错误的

阅读文本文件,然后 echo header()调用后的文本输出。

以下是我如何设置csv下载:

//downloads an export of the user DB
$csv = User::exportUsers();

header('Content-disposition: attachment; filename=userdb.csv');
header('Content-type: text/csv');

echo $csv;

其中 exportUsers() 创建CSV数据。您可以轻松地将$csv替换为文本文件的内容,然后将其回显出来。

至于你的文本文件,你可以使用 file_get_contents() 将文件的内容转换为字符串。然后回显该字符串。

对我来说,这条路是正确的。而且强制下载是在Windows上进行的,而不是在Mac上。

经过几次测试,我发现头内容长度失败了。我在一个完整的url上使用函数filesize,比如:

$url_my_file = "http://my-website.com/folders/file.ext";
header('Content-Length: '.(filesize($url_my_file)));

我用

$url_my_file = "http://my-website.com/folders/file.ext";    
$headers  = get_headers($url_my_file, 1);
header('Content-Length: '.($headers['Content-Length']));

还有…现在工作:)

尝试设置文件的内容长度:

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

另外,请记住:file inclusion

转载请注明:我的代码 » 使用php强制下载空文件