下载文件损坏。内容类型不起作用?

时间:2011-05-09 06:18:24

标签: php download content-type

我想允许用户下载pdf文件,下载代码如下....出于某些奇怪的原因,即使文件正在下载,我也会收到错误消息,说明文件已在服务器上损坏。 ..有人可以帮助我,指出我犯错的地方。

<php

$name = $_POST["name_first"];

    $mail = $_POST['email'];


    $number = $_POST['phone_number'];

            $email_message = "first name: {$name} email is {$mail} number is {$number} ";
            mail('fanaa@gmail.com', 'Form Response', $email_message);

                if ($mail == "" OR $name == "" OR $number == "")
                    {
                        echo "Enter valid details  ";

                    }
                    else
                    {
                        header('Content-type: application/pdf');
                        header('Content-Disposition: attachment; filename="tokina.pdf"');
                        readfile('docs/tokina.pdf');

                    }
?>

8 个答案:

答案 0 :(得分:13)

我使用此代码下载pdfs:

header ("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header('Content-Type: application/octetstream');
    header("Content-Transfer-Encoding: Binary");
    header("Content-length: ".filesize($file));
    header("Content-disposition: attachment; filename=\"".basename($filename)."\"");
    readfile("$file");                
  }

这应该没问题,并确保没有空格或返回字符(不要逃避php是最好的解决方案)。

如果您发现仍有问题,请使用记事本打开损坏的文件(内部可能存在php错误警告)。

希望这有帮助!

答案 1 :(得分:3)

删除标题并查看页面,您是否看到任何错误消息?如果PHP输出的内容不是实际的PDF源,则该文件似乎已损坏。

答案 2 :(得分:1)

header('Content-type: application/pdf');

启用PHP扩展程序php_gettext,您就完成了。

答案 3 :(得分:0)

尝试取出

中的双引号
header('Content-type: "application/octet-stream"');

所以它变成了

header('Content-type: application/octet-stream');

答案 4 :(得分:0)

也许您的内容类型不正确。试试这个:

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="downloaded.pdf"');
readfile('original.pdf');

答案 5 :(得分:0)

您的PDF文件tokina.pdf未上传或与PHP文件不在同一目录中。这就是为什么它保存为“tokina.pdf.htm” - 它正在为404页面加载HTML。这就是为什么您的浏览器/ PDF查看器认为该文件“已损坏” - 因为它的扩展名是PDF但其内容不是。

确保文件已上传,如果是,请确保readfile指向正确的路径。如果它不在同一文件夹中,请使用相对/绝对路径,例如:

readfile('docs/tokina.pdf');

是的,内容类型应为application/pdf

答案 6 :(得分:0)

使用此脚本

   header('Content-Type: application/force-download');
   header('Content-Disposition: attachment; filename='.$filename);
   header('Content-Transfer-Encoding: binary');
   header('Content-Length: '.filesize($filenamepath));

   readfile($filenamepath);

我遇到了同样的问题。使用像UltraEdit这样的十六进制编辑器比较原始文件和下载的文件,我在损坏的文件的开头找到了一些字符。

问题是在?>标记PHP代码结束后,我的代码中有几次行终止符。

删除?>之后的所有行终止符,并阅读论坛文章Downloaded Files are corrupt - Common Problem。这对我有用。

我希望能帮助你。

答案 7 :(得分:0)

我用

$download_path = your path (where to look for the files)
set_time_limit(0);
$file_url = $download_path . $data['link'];
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file_url). '"');
//then to read the file
readfile($file_url);

这通常对我有用