PHP使用CURL实现下载文件功能示例


Posted in PHP onJune 03, 2019

本文实例讲述了PHP使用CURL实现下载文件功能。分享给大家供大家参考,具体如下:

如果使用CURL下载从微信手机端上传的图片?参考下面代码

/**
 * CURL下载文件 成功返回文件名,失败返回false
 * @param $url
 * @param string $savePath
 * @return bool|string
 * @author Zou Yiliang
 */
public function downFile($url, $savePath = './uploads')
{
  //$url = 'http://www.baidu.com/img/bdlogo.png';
  /*
  HTTP/1.1 200 OK
  Connection: close
  Content-Type: image/jpeg
  Content-disposition: attachment; filename="cK4q4fLsp7YOlaqxluDOafB.jpg"
  Date: Sun, 18 Jan 2015 16:56:32 GMT
  Cache-Control: no-cache, must-revalidate
  Content-Length: 963704
  */
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HEADER, TRUE);  //需要response header
  curl_setopt($ch, CURLOPT_NOBODY, FALSE);  //需要response body
  $response = curl_exec($ch);
  //分离header与body
  $header = '';
  $body = '';
  if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200') {
    $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); //头信息size
    $header = substr($response, 0, $headerSize);
    $body = substr($response, $headerSize);
  }
  curl_close($ch);
  //文件名
  $arr = array();
  if (preg_match('/filename="(.*?)"/', $header, $arr)) {
    $file = date('Ym') . '/' . $arr[1];
    $fullName = rtrim($savePath, '/') . '/' . $file;
    //创建目录并设置权限
    $basePath = dirname($fullName);
    if (!file_exists($basePath)) {
      @mkdir($basePath, 0777, true);
      @chmod($basePath, 0777);
    }
    if (file_put_contents($fullName, $body)) {
      return $file;
    }
  }
  return false;
}

附:常用CURL选项说明

CURLOPT_AUTOREFERER
当根据Location:重定向时,自动设置header中的Referer:信息。

CURLOPT_BINARYTRANSFER
在启用CURLOPT_RETURNTRANSFER的时候,返回原生的(Raw)输出。

CURLOPT_COOKIESESSION
启用时curl会仅仅传递一个session cookie,忽略其他的cookie,默认状况下cURL会将所有的cookie返回给服务端。session cookie是指那些用来判断服务器端的session是否有效而存在的cookie。

CURLOPT_CRLF
启用时将Unix的换行符转换成回车换行符。

CURLOPT_DNS_USE_GLOBAL_CACHE
启用时会启用一个全局的DNS缓存,此项为线程安全的,并且默认启用。

CURLOPT_FAILONERROR
显示HTTP状态码,默认行为是忽略编号小于等于400的HTTP信息。

CURLOPT_FILETIME
启用时会尝试修改远程文档中的信息。结果信息会通过 curl_getinfo()函数的CURLINFO_FILETIME选项返回。curl_getinfo().

CURLOPT_FOLLOWLOCATION
启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。

CURLOPT_FORBID_REUSE
在完成交互以后强迫断开连接,不能重用。

CURLOPT_FRESH_CONNECT
强制获取一个新的连接,替代缓存中的连接。

CURLOPT_FTP_USE_EPRT
启用时当FTP下载时,使用EPRT (或 LPRT)命令。设置为FALSE时禁用EPRT和LPRT,使用PORT命令 only.

CURLOPT_FTP_USE_EPSV
启用时,在FTP传输过程中回复到PASV模式前首先尝试EPSV命令。设置为FALSE时禁用EPSV命令。

CURLOPT_FTPAPPEND
启用时追加写入文件而不是覆盖它。

CURLOPT_FTPASCII
CURLOPT_TRANSFERTEXT的别名。

CURLOPT_FTPLISTONLY
启用时只列出FTP目录的名字。

CURLOPT_HEADER
启用时会将头文件的信息作为数据流输出。

CURLINFO_HEADER_OUT
启用时追踪句柄的请求字符串。
从 PHP 5.1.3 开始可用。CURLINFO_前缀是故意的(intentional)。

CURLOPT_HTTPGET
启用时会设置HTTP的method为GET,因为GET是默认是,所以只在被修改的情况下使用。

CURLOPT_HTTPPROXYTUNNEL
启用时会通过HTTP代理来传输。

CURLOPT_MUTE
启用时将cURL函数中所有修改过的参数恢复默认值。

CURLOPT_NETRC
在连接建立以后,访问~/.netrc文件获取用户名和密码信息连接远程站点。

CURLOPT_NOBODY
启用时将不对HTML中的BODY部分进行输出。

CURLOPT_NOPROGRESS
启用时关闭curl传输的进度条,此项的默认设置为启用。
Note:
PHP自动地设置这个选项为TRUE,这个选项仅仅应当在以调试为目的时被改变。

CURLOPT_NOSIGNAL
启用时忽略所有的curl传递给php进行的信号。在SAPI多线程传输时此项被默认启用。
cURL 7.10时被加入。

CURLOPT_POST
启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。

CURLOPT_PUT
启用时允许HTTP发送文件,必须同时设置CURLOPT_INFILE和CURLOPT_INFILESIZE。

CURLOPT_RETURNTRANSFER
将 curl_exec()获取的信息以文件流的形式返回,而不是直接输出。

CURLOPT_SSL_VERIFYPEER
禁用后cURL将终止从服务端进行验证。使用CURLOPT_CAINFO选项设置证书使用CURLOPT_CAPATH选项设置证书目录 如果CURLOPT_SSL_VERIFYPEER(默认值为2)被启用,CURLOPT_SSL_VERIFYHOST需要被设置成TRUE否则设置为FALSE。
自cURL 7.10开始默认为TRUE。从cURL 7.10开始默认绑定安装。

CURLOPT_TRANSFERTEXT
启用后对FTP传输使用ASCII模式。对于LDAP,它检索纯文本信息而非HTML。在Windows系统上,系统不会把STDOUT设置成binary模式。

CURLOPT_UNRESTRICTED_AUTH
在使用CURLOPT_FOLLOWLOCATION产生的header中的多个locations中持续追加用户名和密码信息,即使域名已发生改变。

CURLOPT_UPLOAD
启用后允许文件上传。

CURLOPT_VERBOSE
启用时会汇报所有的信息,存放在STDERR或指定的CURLOPT_STDERR中。

PS:具体curl参数说明可参考:https://3water.com/article/39331.htm

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP基础知识回顾
Aug 16 PHP
表格展示无限级分类(PHP版)
Aug 21 PHP
深入php函数file_get_contents超时处理的方法详解
Jun 03 PHP
php获取Google机器人访问足迹的方法
Apr 15 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
Sep 29 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
Dec 24 PHP
PHP常用的三种设计模式汇总
Aug 28 PHP
php根据年月获取当月天数及日期数组的方法
Nov 30 PHP
php实现XML和数组的相互转化功能示例
Feb 08 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
Nov 30 PHP
php实现简单的守护进程创建、开启与关闭操作
Aug 13 PHP
PHP使用递归按层级查找数据的方法
Nov 10 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 #PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
Jun 03 #PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
Jun 03 #PHP
PHP工厂模式、单例模式与注册树模式实例详解
Jun 03 #PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
May 31 #PHP
PHP使用ActiveMQ实现消息队列的方法详解
May 31 #PHP
php中的buffer缓冲区用法分析
May 31 #PHP
You might like
PHP 处理图片的类实现代码
2009/10/23 PHP
php中使用explode查找某个字符是否存在的方法
2011/07/12 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
jquery.ui.progressbar 中文文档
2009/11/26 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
原生js实现addclass,removeclass,toggleclasss实例
2016/11/24 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
python实现socket端口重定向示例
2014/02/10 Python
10种检测Python程序运行时间、CPU和内存占用的方法
2015/04/01 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
python实战教程之自动扫雷
2018/07/13 Python
Django进阶之CSRF的解决
2018/08/01 Python
python3实现猜数字游戏
2020/12/07 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
Django models文件模型变更错误解决
2020/05/11 Python
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
校园演讲稿汇总
2014/05/21 职场文书
2014学习十八届四中全会精神思想汇报范文
2014/10/23 职场文书
2014年售票员工作总结
2014/11/19 职场文书
靠谱准确的求职信
2019/04/02 职场文书
蔬果开业典礼发言稿应该怎么写?
2019/09/03 职场文书
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server