使用PHP提供文件下载

时间:2010-05-07 09:24:37

标签: php download

第一个PHP项目,我被卡住了!
我希望允许用户点击按钮或链接并下载文件。

但是,我的PHP必须首先执行一些任务,选择正确的文件,在db等中记录下载事件。我可以这样做,但是如何将文件作为对用户点击的响应发送?

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

正如@Sarfraz建议的那样,在完成您需要完成的任务后,您可以向浏览器发送Content-Type标题,然后将该文件的内容吐出到浏览器中。然后,浏览器将根据用户设置执行,通常是a)打开并显示文件或b)将文件保存到磁盘。

如果要强制将文件保存到磁盘而不是在浏览器中显示,常用的方法是指定mime-type Content-Type: application/octet-stream。也可以使用标题Content-Disposition: attachment; filename=foobar.baz指定附件文件名。

答案 1 :(得分:0)

在脚本中发送相应的标题:

header("content-type: application/pdf");

根据您的文件使用正确的mime-type,并使用 readfile 将内容发送到浏览器。

答案 2 :(得分:0)

header("Content-type: image/png");(或其他任何东西),然后输出文件。

答案 3 :(得分:0)

这是一个可用于将文件直接发送到浏览器的功能。

$fileName:需要发送到浏览器的文件的路径+名称 $downloadName:这是用户在下载时看到的文件的名称(无需路径)(不一定与$filename

相同
 function sendFileDirectlyToBrowser($downloadName, $fileName) {
        if (! file_exists($fileName)) {
            throw new Exception('file does not exist!');
        }

        $pathInfo = pathinfo($fileName);

        //list with mime-types http://en.wikipedia.org/wiki/Mime_type#List_of_common_media_types

        switch (strtolower($pathInfo['extension'])) {
            case 'csv':
                header("Content-type: test/csv");
                break;
            case 'doc':
            case 'docx':
                header("Content-type: application/msword");
                break;
            case 'gif':
                header("Content-type: image/gif");
                break;
            case 'jpg':
            case 'jpeg':
                header("Content-type: image/jpeg");
                break;
            case 'png':
                header("Content-type: image/png");
                break;
            case 'pdf':
                header("Content-type: application/pdf");
                break;
            case 'tiff':
                header("Content-type: image/tiff");
                break;
            case 'txt':
                header("Content-type: text/plain");
                break;
            case 'zip':
                header("Content-type: application/zip");
                break;
            case 'xls':
            case 'xlsx':
                if(!(strpos($HTTP_USER_AGENT,'MSIE') === false)) {
                    header("Content-type:application/x-msdownload");
                }
                else {
                    header("Content-type:application/vnd.ms-excel ");
                }
                break;
        }


        header('Content-Disposition:attachment;filename="'  . $downloadName . '"');
        print file_get_contents($fileName);
    }