强制下载文件与PHP给出空文件

时间:2010-08-25 07:37:46

标签: php file download

最终目标是让用户下载.csv文件。现在我只是试着下载一个简单的文本文件:test.txt。这个文件中唯一的东西是“测试”一词。

以下是files_to_download.php

的HTML代码
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服务器上是否存在可能不存在的配置,或者我是否遗漏了上述内容。

感谢您的期待!

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

读取文本文件,然后在标题()调用后echo显示文本。

以下是我设置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()将文件内容转换为字符串。然后回复那个字符串。

答案 2 :(得分:1)

就我而言,路径是正确的。下载强制在Windows上工作,但不是mac。

我在几次测试后发现标题 Content-Length 失败了。我在完整的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']));

而且......它现在正在运作:)

答案 3 :(得分:0)

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

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

另外,请记住这一点:file inclusion

相关问题