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;

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值