PHP Force下载返回损坏的文件

时间:2009-09-13 19:48:39

标签: php zend-framework download

您好我正在我的osx-apache上处理一些php-zend框架项目。问题是,当我想使用我的php应用程序强制下载某些文件时,下载的文件已损坏,文件大小为5.4 kb!我在我的代码中尝试了很多更改,甚至使用了一些类来强制下载,但问题仍然是一样的!我应该说我在我的控制器的一个动作中使用了强制下载。重写或类似的内容是否会影响文件的下载?!

这是基本代码:

header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file["files_url"]));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file["files_url"]));
    ob_clean();
    flush();
    readfile($file["files_url"]);
    exit;*/

我使用的类:BF_Download

$download = new Download($file["files_url"],$file["files_title"],"on",20);
    $download->download_file();

并且:

$zip = new zip_file("../".$file["files_title"].".zip");

    $zip->set_options(array('inmemory' => 1, 'recurse' => 0, 'storepaths' => 0));
    $zip->add_files($file["files_url"]);
    $zip->create_archive();
    $zip->download_file();*/

3 个答案:

答案 0 :(得分:4)

尝试在网页上将文件视为二进制数据。可能发生的是,一些PHP错误正在潜入输出并破坏它。

因此,请跳过内容类型标题,然后查看纯数据。

如果您还没有看到它,请保持原状并查看错误日志。

答案 1 :(得分:2)

好的,我在 dcaunt 的最后一条评论的帮助下找到了问题,实际上我只是看一下输出文件的二进制源,发现有一个很小的换行符和空格在第一行,所以通过删除它们,文件返回到它的正常状态,它变得可读。所以为了销毁这些空间,我决定在我的控制器中删除我的php脚本标签“?>”的结尾,这导致php不将它们发送到输出内容。非常感谢你的评论:)

答案 2 :(得分:0)

我强烈建议使用此Action Helper来发送文件 - 它可以从内存或磁盘上的文件发送数据,并可以轻松设置缓存和内容的选项

尽管名称为SendFile,但apache sendfile不是必需的。