• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

【PHP】本地文件&远程文件下载

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
<?php

/**
 * @description  文件下载 支持本地和远程文件(浏览器直接下载)
 * @param        $fileUrl  本地文件绝对路径 OR 远程文件地址
 * @param string $fileName 下载保存的文件名
 */
function download_file($fileUrl, $fileName = ''){
    if(!$fileUrl){
        return false;
    }
    if ($fileName == '') {
        $pathInfo = pathinfo($fileUrl);
        $fileName = $pathInfo['basename'];
    }

    if (!headers_sent()) {
        //直接下载本地文件
        if (file_exists($fileUrl)) {
            $fileOpen = fopen($fileUrl, 'rb');
            $fileSize = filesize($fileUrl);
            header("Cache-Control: public");//缓存控制
            header("Content-Type: application/octet-stream");
            header("Accept-Ranges: bytes");
            header("Content-Length: " . $fileSize);
            header('Access-Control-Expose-Headers: Content-Disposition');
            header("Content-Disposition: attachment; filename=" . $fileName);
            $chunk_size = 4096; // 针对大文件,规定每次读取文件的字节数为4096字节,直接输出数据
            $sum_buffer = 0; //总的缓冲的字节数
            ob_start(); // 开启缓冲区
            //只要没到文件尾,就一直读取
            while (!feof($fileOpen) && $sum_buffer < $fileSize) {
                echo fread($fileOpen, $chunk_size);
                $sum_buffer += $chunk_size;
                ob_flush(); // 刷新PHP缓冲区到Web服务器
                flush(); // 刷新Web服务器缓冲区到浏览器
            }
            ob_end_clean(); // 关闭缓冲区
            fclose($fileOpen);
            exit;
        }else{
            //直接下载远程文件并输出到浏览器
            ob_start();
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $fileUrl);
            curl_setopt($ch, CURLOPT_REFERER, "");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            $cexecute = curl_exec($ch);
            curl_close($ch);
            header('Content-Disposition: attachment; filename="'.$fileName.'"');
            header('Content-Length:'.strlen($cexecute));
            echo $cexecute;
            ob_flush();
            flush();
            ob_end_clean();
            exit;
        }
    }else{
        exit;
    }

}


/**
 * @description  下载远程文件到本地
 * @param        $fileUrl
 * @param string $savaDir
 * @return bool|string
 */
function save_file($fileUrl,$savaDir='uploads/temporary/'){
    if(!$fileUrl){
        return false;
    }
    $savaDir = $savaDir ? rtrim($savaDir,'/').'/' : '';
    $localTemporaryDir = FILE_UPLOAD.$savaDir;//此处注意改成自己项目配置的文件下载目录
    if(!is_dir($localTemporaryDir)){
        mkdir($localTemporaryDir,0777,true);
    }

    $baseName = pathinfo($fileUrl)['basename'];
    $fName = substr($baseName,0,strpos($baseName, '?'));//去除文件的签名相关参数
    $localFile = $localTemporaryDir . $fName;

    if(file_exists($localFile)){
        unlink($localFile);
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $fileUrl);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 900);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE);
    $file = curl_exec($ch);
    curl_close($ch);
    if(!strpos($file, '<Error>')){
        file_put_contents($localFile, $file);
    }
    if (file_exists($localFile)) {
        return $localFile;
    }
    return false;
}


?>

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap