PHP下载远程文件

PHP下载 下载远程文件 PHP下载文件

有时候需要下载文件,图片、文件之类的,所以写了一个方法:

/**

 * 下载文件

 * @param string $sourceName 要下载文件的地址

 * @param string $save_path 下载后文件保存目录

 * @param string $filename 下载后文件保存名称

 * @return bool

 */

function downloadFile($sourceName, $save_path = '', $filename = '') {

    //判断远程文件不能为空

    if (trim($sourceName) == '') {

        return false;

    }

    //判断远程文件是否能打开

    if (false === @fopen($sourceName, 'rb')) {

        return false;

    }

    //判断保存路径是否为空,为空的话默认保存到根目录下runtime目录

    if (trim($save_path) == '') {

        $save_path = Env::get('root_path') . 'runtime/';

    }

    //保存目录不存在则创建之

    if (!file_exists($save_path) && !mkdir($save_path, 0777, true)) {

        return false;

    }

    //保存的文件名如果没有,默认取文件类型前的名字(可自己拓展)

    if (trim($filename) == '') {

        $img_ext = strrchr($sourceName, '.');

        $img_exts = array('.zip','.jpg','.jpeg','.png','.gif','.pdf');

        if (!in_array($img_ext, $img_exts)) {

            return false;

        }

        $filename = time() . $img_ext;

    }

    // curl下载文件

    $ch         = curl_init();

    //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //不验证证书

    //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //不验证证书

    curl_setopt($ch, CURLOPT_URL, $sourceName);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);

    $result     = curl_exec($ch);

    curl_close($ch);

//判断文件流是否为空(因为这里可能会获取到空到文件流,这样保存之后到文件是错误的),为空就用另一种方法获取文件流

    if(empty($result)){

        ob_start();

        readfile($sourceName);

        $result = ob_get_contents();

        ob_end_clean();

    }

    // 保存文件流到指定路径文件

    $length = file_put_contents($save_path.$filename, $result);

    //保存失败就重新保存

    if($length == 0){

        unlink($save_path.$filename);

        if(!empty($result)){

            $fp2 = @fopen($save_path . $filename, 'a');

            fwrite($fp2, $result);

            fclose($fp2);

        }

    }

    //释放资源

    unset($result, $url);

    return true;

}


在需要的地方直接调用这个方法就可以了,这样就可以保证文件能下载成功!