有时候需要下载文件,图片、文件之类的,所以写了一个方法:
/**
* 下载文件
* @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;
}
在需要的地方直接调用这个方法就可以了,这样就可以保证文件能下载成功!