文档章节

PHP cURL上传图片

Jpchina
 Jpchina
发布于 2017/05/09 13:39
字数 620
阅读 199
收藏 0

在PHP5.5之前的版本,curl上传文件的方法是使用 @+文件绝对路径 将post数组传递给 CURLOPT_POSTFIELDS

curl_setopt(ch, CURLOPT_POSTFIELDS, array('file'=> '@'.realpath('file.png')));

在5.5版本之后引入了 CURLFile类 http://php.net/manual/zh/curlfile.construct.php 另外也引入了 CURL_SAFE_UPLOAD 选项,可以强制PHP的cURL模块拒绝旧的@语法,仅接受CURLFile式的文件。5.5的默认值为false,5.6的默认值为true。并且5.6已经移除了 @+文件绝对路径 这种上传文件的方法。 CURLFile类 的使用方法

curl_setopt($curl, CURLOPT_POSTFIELDS, ['name'=> new CURLFile('文件绝对路径','文件类型(image/jpeg)'),]);

下面是自己写的一个curl发送请求方法,可附加附件

public function Https_request( $url ,  $data = null, $cookie =null, $file =null) {
  $curl= curl_init ();
  curl_setopt ( $curl, CURLOPT_URL, $url);
  curl_setopt ( $curl
, CURLOPT_SSL_VERIFYPEER, FALSE );


curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, FALSE );

//携带cookie文件
if(! empty($cookie)){
  curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie); //读取cookie
}

 //携带头
if(!empty($header)){
  curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
}

//上传文件
if(!empty($file)){
  $file_obj=new CURLFile($file['realpath'],$file['type']);
  $data["{$file['name']}"]=$file_obj;
}

 //发送post数据
if(! empty( $data) && !isset($file_obj)) {
  curl_setopt ( $curl, CURLOPT_POST, 1 );
  curl_setopt ( $curl, CURLOPT_POSTFIELDS, http_build_query($data) );
}elseif(!empty($data)){
  curl_setopt ( $curl, CURLOPT_POST, 1 );
  curl_setopt ( $curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 );
$output= curl_exec ( $curl);

if(empty($output)) return false;
curl_close ( $curl);
return is_null(json_decode($output))?$output:json_decode($output,true);
}

声明:

以上转载与本文,PHP CURL 上传图片,如有侵权,请您及时联系!

总结:之所以处理curl图片上传时踩了很多的坑,究竟其根本还是对Http协议不了解,对底层的知识点掌握的不牢固;对apache和php交互还不是很好;发奋图强研读RFC2616,这些知识点也是web开发工程师必备之一。

自己写的函数

    /**
     * 上传文件
     *
     * @param string $url 访问链接
     * @param mixed $params POST的提交数据
     * @param string $timeout 超时时间
     *
     * @return json
     */
    public function upload($url, $param, $timeout) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);                                    // 设置访问链接
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);                         // 是否返回信息
        curl_setopt($ch, CURLOPT_HEADER, 'Content-type: application/json');     // 设置返回信息数据格式 application/json
        curl_setopt($ch, CURLOPT_POST, TRUE);                                   // 设置post方式提交
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param));        // POST提交数据
        $keyName = array_keys($_FILES);
        $curlFile = new \CURLFile($_FILES[$keyName[0]]['tmp_name'], $_FILES[$keyName[0]]['type'], $_FILES[$keyName[0]]['name']);
        curl_setopt($ch, CURLOPT_POSTFIELDS, [$keyName[0] => $curlFile]);        // POST提交文件

        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);                            // 超时时间
        $result = curl_exec($ch);
        $err_no = curl_errno($ch);                                              // 获取错误编号,0为正常
        curl_close($ch);
        if ($err_no) {
            return '请求失败,错误码:' . $err_no;
        } elseif (is_null(json_decode($result))) {
            return '请求返回异常:' . $result;
        }
        return $result;
    }

参考文献:

curl函数和curl_error错误码说明

考虑 PHP 5.0~5.6 各版本兼容性的 cURL 文件上传

PHP CURL 上传图片

© 著作权归作者所有

Jpchina

Jpchina

粉丝 7
博文 89
码字总数 36724
作品 0
浦东
程序员
私信 提问
那们基友有没有用php curl模拟上传微信素材图片.

哪们基友有没有用php curl模拟登录后,然后模拟上传微信公众平台的素材图片. 本来想用curl @+文件路径的方法来实现,但是分析下还是不行,必须要用form表单enctype="multipart/form-data" 二进制...

钉子2012
2013/09/13
4.1K
5
模拟php curl向远程服务器上传文件

test.php: <?php header('content-type:text/html;charset=utf8'); $ch = curl_init(); //加@符号curl就会把它当成是文件上传处理 $data = array('img'=>'@'. dirname(FILE).'/img/1.jpg');......

Adam-Lee
2012/04/20
0
2
Apache目录禁止解析

比如有一个目录允许上传图片,预防别人上传php文件上去。Apache加载了php模块,有php请求肯定能解析。Php有一些比较危险的函数,所以开放了上传的权限,肯定会被上传一些恶意的木马文件上来,...

虾米的春天
2017/12/26
0
0
《CURL技术知识教程》系列分享专栏

《CURL技术知识教程》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201737.html 文章 PHP采集相关教程之一 CURL函数库 php中通过curl模拟登陆discuz论坛的实现...

开元中国2015
2018/11/06
0
0
在PHP中使用CURL,“撩”服务器只需几行——php curl详细解析和常见大坑

在PHP中使用CURL,“撩”服务器只需几行——php curl详细解析和常见大坑 七夕啦,作为开发,妹子没得撩就“撩”下服务器吧,妹子有得撩的同学那就左拥妹子右抱服务器吧,况且妹子是要礼物的,...

Stinson_Zhao
2016/08/09
1K
7

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 吾不好梦中插人

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @鱼豆腐233 :#今日歌曲分享# 分享My Chemical Romance的单曲《I Don't Love You》: 《I Don't Love You》- My Chemical Romance 手机党少年们...

小小编辑
46分钟前
17
4
ss5 vpn 安装(linux版本)

1. 创建一个文件夹 /ss5 你也可以自定义,不过后续的地方需要注意自己的地址 2. 下载ss5文件(如果你的服务器没有安装wget请使用 yum -y install wget 命令安装 如果连yum都没安装自己查去)(下...

太黑_thj
今天
2
0
八、RabbitMQ的集群原理

集群架构 写在前面 RabbitMQ集群是按照低延迟环境设计的,千万不要跨越WAN或者互联网来搭建RabbitMQ集群。如果一定要在高延迟环境下使用RabbitMQ集群,可以参考使用Shovel和Federation工具。...

XuePeng77
今天
5
0
mac系统下,brew 安装mysql,用终端可以连接,navicat却连接不上?

问题: 1.报错? 2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_sha2_password.so, 2): image not found 2.自己通过设置,已经把密......

写bug的攻城狮
昨天
3
0
老生常谈,HashMap的死循环

问题 最近的几次面试中,我都问了是否了解HashMap在并发使用时可能发生死循环,导致cpu100%,结果让我很意外,都表示不知道有这样的问题,让我意外的是面试者的工作年限都不短。 由于HashMap...

群星纪元
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部