力下载脚本 [英] force download script

查看:118
本文介绍了力下载脚本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的工作一个很好的强制下载文件脚本,目的是为了让正在提供一定要下载的文件,而不是显示在浏览器,无论是什么类型的文件。

它曾经工作得很好,但最近我收到的反馈意见,这是行不通的,特别是对PDF和XLS文件(MS Excel中)。该文件是在PDF的情况下,检测为无效,或获取的HTML文件目录页的一部分,其在XLS文件的情况下,内容之上。

什么是我的功能究竟错了吗?

在这里。需要注意的是它可以工作无论是与URL或本地路径。

 函数offerToDownloadFile($文件名,$ ACCESS_TYPE ='URL'){
    / *
    PHP FORCE下载脚本
    * /    //需要IE浏览器,否则内容处置被忽略
        如果(ini_get('zlib.output_com pression'))
            的ini_set('zlib.output_com pression','关');        如果($ ACCESS_TYPE ===URL){
        //访问类型是通过文件的URL
            $ parsed_url = parse_url($文件名);
            $ FileInfo的= PATHINFO($文件名);
            $ parsed_url ['扩展'] = $的FileInfo ['扩展'];
            $ parsed_url ['名'] = $的FileInfo ['基本名'];
            $ parsed_url ['的localPath'] = LOCALROOT。 $ parsed_url ['路径'];
        }
        其他{
        //访问类型是本地文件路径
            $ FileInfo的= PATHINFO($文件名);
            $ parsed_url ['的localPath'] = $文件名;
            $ parsed_url ['名'] =基本名($文件名);
            $ parsed_url ['扩展'] = $的FileInfo ['扩展'];
        }
        //以防万一有加盟DOCUMENT_ROOT和路径时创建一个双斜杠
        $ parsed_url ['的localPath'] = preg_replace('/ \\ / \\ //','/',$ parsed_url ['的localPath']);        如果(!file_exists($ parsed_url ['局部路径'])){
            死(找不到文件:'$ parsed_url ['的localPath']);
        }
        $ allowed_ext =阵列(芯片,PDF,PNG,JPG,JPEG,拉链,文档,XLS,GIF,EXE,PPT,爱','PSD','ODT');
        如果(!in_array($ parsed_url ['扩展'],$ allowed_ext)){
            死('该文件类型是被禁止的。');
        }        开关($ parsed_url ['扩展']){
            案集成电路:$ CTYPE =文本/日历
                打破;
            案PDF:$ CTYPE =应用程序/ PDF
                打破;
            案EXE:$ CTYPE =应用程序/八位字节流;
                打破;
            案拉链:$ CTYPE =应用程序/压缩
                打破;
            案DOC:$ CTYPE =应用程序/ msword
                打破;
            案XLS:
                $ CTYPE =应用程序/ vnd.ms-EXCEL;
                打破;
            案PPT:$ CTYPE =应用程序/ vnd.ms-简报;
                打破;
            案GIF:$ CTYPE =图像/ GIF;
                打破;
            案PNG:$ CTYPE =图像/ PNG
                打破;
            案JPEG:
            案JPG:$ CTYPE =图像/ JPG
                打破;
            默认:$ CTYPE =应用程序/力下载;
        }
        标题(杂注:公); //要求
        标题(过期:0);
        标题(缓存控制:必重新验证,检查后= 0,pre-检查= 0);
        标题(缓存控制:私人,FALSE); //需要某些浏览器
        标题(内容类型:$ CTYPE);
        标题(内容处置:附件;文件名= \\$ parsed_url ['名']\\;);
        标题(内容传输编码:二进制);
        //标题(内容长度:文件大小($ parsed_url ['的localPath']));
        ReadFile的($ parsed_url ['的localPath']);
        clearstatcache()函数;
        死();
        出口();
    }


解决方案

脚本现在工作。我不得不做出这个头()调用来代替。我真的不知道为什么,它的试验和错误,导致我这一解决方案。

 标题(内容类型:$ CTYPE);
标题(内容处置:附件;文件名= \\$ parsed_url ['名']\\;);
标题(内容传输编码:二进制);
头(接受-范围:字节);
标题(缓存控制:私人);
头('用法:私人');
标题(截止日期:星期一,1997 05:00:00 GMT 7月26日);

I worked on a nice "force download file" script which purpose is to make sure files are being offered to download instead of displayed in the browser, no matter what type of file that is.

It used to work well but recently i received feedback that it wouldn't work, notably for pdf and xls files (MS Excel). The file is either detected as "invalid" in the case of the PDF, or gets part of the html file directory page on top of its content in the case of the xls file.

What is wrong exactly with my function?

Here it is. Note that it can work either with a url or a local path.

    function offerToDownloadFile($filename, $access_type='url') {
    /*
    PHP FORCE DOWNLOAD SCRIPT
    */

    // required for IE, otherwise Content-disposition is ignored
        if (ini_get('zlib.output_compression'))
            ini_set('zlib.output_compression', 'Off');

        if($access_type === 'url') {
        // access type is via the file 's url
            $parsed_url = parse_url($filename);
            $fileinfo = pathinfo($filename);
            $parsed_url['extension'] = $fileinfo['extension'];
            $parsed_url['filename'] = $fileinfo['basename'];
            $parsed_url['localpath'] = LOCALROOT . $parsed_url['path'];
        }
        else {
        // access type is the local file path
            $fileinfo = pathinfo($filename);
            $parsed_url['localpath'] = $filename;
            $parsed_url['filename'] = basename($filename);
            $parsed_url['extension'] = $fileinfo['extension'];
        }


        // just in case there is a double slash created when joining document_root and path
        $parsed_url['localpath'] = preg_replace('/\/\//', '/', $parsed_url['localpath']);

        if (!file_exists($parsed_url['localpath'])) {
            die('File not found: ' . $parsed_url['localpath']);
        }
        $allowed_ext = array('ics','pdf', 'png', 'jpg', 'jpeg', 'zip', 'doc', 'xls', 'gif', 'exe', 'ppt','ai','psd','odt');
        if (!in_array($parsed_url['extension'], $allowed_ext)) {
            die('This file type is forbidden.');
        }

        switch ($parsed_url['extension']) {
            case "ics": $ctype="text/calendar";
                break;
            case "pdf": $ctype = "application/pdf";
                break;
            case "exe": $ctype = "application/octet-stream";
                break;
            case "zip": $ctype = "application/zip";
                break;
            case "doc": $ctype = "application/msword";
                break;
            case "xls": 
                $ctype = "application/vnd.ms-excel";
                break;
            case "ppt": $ctype = "application/vnd.ms-powerpoint";
                break;
            case "gif": $ctype = "image/gif";
                break;
            case "png": $ctype = "image/png";
                break;
            case "jpeg":
            case "jpg": $ctype = "image/jpg";
                break;
            default: $ctype = "application/force-download";
        }
        header("Pragma: public"); // required
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private", false); // required for certain browsers
        header("Content-Type: $ctype");
        header("Content-Disposition: attachment; filename=\"" . $parsed_url['filename'] . "\";");
        header("Content-Transfer-Encoding: binary");
        //  header("Content-Length: " . filesize($parsed_url['localpath']));
        readfile($parsed_url['localpath']);
        clearstatcache();
        die();
        exit();
    }

解决方案

The script now works. I had to make this header() calls instead. I don't really know why, it's trial and error that led me to this solution.

header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"" . $parsed_url['filename'] . "\";");
header("Content-Transfer-Encoding: binary");
header('Accept-Ranges: bytes');
header("Cache-control: private");
header('Pragma: private');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

这篇关于力下载脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆