PHP文件下载小技巧

作者: DullCat | 来源:发表于2018-06-05 09:50 被阅读11次

安利两种php的下载函数

1.readfile,获取文件的句柄(注意:这里是句柄而不是文件,所以只占用很小的内存)并将句柄输出到缓冲区

function readfile_download($url, $filename,$opt = null)
{
    //设置http下载消息报文
    header("Content-Disposition:  attachment;  filename=" . $filename);
    header("Pragma:  no-cache");
    header("Expires:  0");
    //有些下载需要附带cookie和useragent
    $cookie = $opt['cookie'] ? $opt['cookie'] : '';
    $useragent = $opt['useragent'] ? $opt['useragent'] : '';
    $opts = array(
        'http' => array(
            'method' => 'GET',
            'header' =>
                "UserAgent:$useragent\r\n" .
                "Cookie:$cookie \r\n",
        )
    );
    $context = stream_context_create($opts);
    readfile($url,false,$context);
}

但是缓冲区同样有限制大小,默认的缓冲区只有4k,一旦缓冲区溢出,同样也会占用内存,所以如果要进行多人大文件下载,缓冲区也要被限制


2.使用fopen获取远程文件的句柄,然后使用fread分段获取并输出,这样不仅占用的内存少,而且占据的缓冲区也少,可以用于多人大文件下载场景

function0 fopen_download($url, $filename,$opt = null,$limit = 1024)
{
    //设置http下载消息报文
    header("Content-Disposition:  attachment;  filename=" . $filename);
    header("Pragma:  no-cache");
    header("Expires:  0");
    //有些下载需要附带cookie和useragent
    $cookie = $opt['cookie'] ? $opt['cookie'] : '';
    $useragent = $opt['useragent'] ? $opt['useragent'] : '';
    $opts = array(
        'http' => array(
            'method' => 'GET',
            'header' =>
                "UserAgent:$useragent\r\n" .
                "Cookie:$cookie \r\n",
        )
    );
    $context = stream_context_create($opts);
    $handle = fopen($url, "r", false, $context);
    //输出
    while (!feof($handle)) {
        $content = fread($handle, intval($limit));
        echo $content;
        ob_flush();
    }
}

3.有些考虑到安全的项目,是会禁用fopen打开URL,又或是考虑到打开URL的稳定性和性能,所以想使用cURL函数

function download($url,$filename,$opt=null,$limit = 1024)
{
    //curl获取远程文件并储存在临时文件内
    $ch = curl_init();
    $fp = tmpfile();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    $cookie = $opt['cookie'] ? $opt['cookie'] : null;
    $useragent = $opt['useragent'] ? $opt['useragent'] : $_SERVER['HTTP_USER_AGENT'];
    curl_setopt($ch, CURLOPT_COOKIE, $cookie);
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
    curl_exec($ch);
    curl_close ($ch);
    //设置http下载消息报文
    header("Content-Disposition:  attachment;  filename=" . $filename);
    header("Pragma:  no-cache");
    header("Expires:  0");
    rewind($fp);
    //输出
    while (!feof($fp) && is_resource($fp)) {
        $content = fread($fp, $limit);
        echo $content;
        ob_flush();
    }
    //关闭并销毁临时文件
    fclose($fp);
}

相关文章

  • PHP文件下载小技巧

    安利两种php的下载函数 1.readfile,获取文件的句柄(注意:这里是句柄而不是文件,所以只占用很小的内存)...

  • 文件下载

    常见的文件格式: 文件下载HTML 图片文件下载PHP

  • windows下 用nginx部署php项目

    nginx下载地址 php下载 配置PHP 解压后在文件夹中找到php.ini-development文件复制一份...

  • mac下安装composer

    1、下载composer的php文件 2、运行php文件,然后就会自动下载一个composer.phar的文件 3...

  • PHP 通过Nginx x-sendfile实现文件鉴权下载

    通过php鉴权,文件下载由 nginx 实现;比使用php readfile() 高效; 比如下载的文件为: /d...

  • PHP文件下载

    注意事项:1.不能用ajax请求 可以用window.location.href()等传过来 //文件下载 fun...

  • PHP文件下载

    PHP文件下载

  • php文件下载

    今天对照视频做了一个图片下载程序,下载的图片老提示文件过大,或者文件被损坏,用记事本打开源文件跟程序下载的图片发现...

  • IIS 下部署 PHP

    一、先下载PHP 下载MySQL1、安装对应的VC++ 二、配置PHP1、下载包解压缩到 d:/php 文件夹 ...

  • 2018-03-25windows下配置php+composer

    下载php压缩包 解压至特定目录 修改配置文件将php.ini-development文件改为php.ini 添加...

网友评论

    本文标题:PHP文件下载小技巧

    本文链接:https://www.haomeiwen.com/subject/fkudsftx.html