通过curl上传图片

  • PHP < 5.5:
    使用 目前使用的php版本 7.1 测试无法使用 前面加@ 的方法上传文件 ,查找资料 使用 curl_setopt($ch,CURLOPT_SAFE_UPLOAD,FALSE) 可以解决,但是经测试 这种方式不行,显示的CURLOPT_SAFE_UPLOAD这个选项在该版本php中已经被废弃

  • 可以通过检测 有没有 curl_file_create 这个函数 也可以检测 有没有类\CURLFile class_exists('\CURLFile')

$filename = new \CURLFile(realpath($filepath),$minetype,$basename);
或者
$filename = curl_file_create(realpath($filepath),$minetype,$basename);

if (!function_exists('curl_file_create')) {function curl_file_create($filename, $mimetype = '', $postname = '') {return "@$filename;filename=". ($postname ?: basename($filename)). ($mimetype ? ";type=$mimetype" : '');}}$ch = curl_init();
$filename = 'C:/Users/shanghai/Pictures/Camera Roll/23.jpg';
$minetype = 'image/jpeg';
$curl_file = curl_file_create($filename,$minetype);
$postData = ['file' => '111','text' => '666','file_name'=>$curl_file ,
];curl_setopt($ch, CURLOPT_URL, 'xxx.com/test/curl');
//curl结果不直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//发送post  请求
curl_setopt($ch, CURLOPT_POST, 1);
// urlencoded 后的字符串,类似'para1=val1&para2=val2&...',也可以使用一个以字段名为键值,字段数据为值的数组 ,测试当值为数组时候  Content-Type头将会被设置成multipart/form-data 否则Content-Type 头会设置为 application/x-www-form-urlencoded
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
//curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));//允许 cURL 函数执行的最长秒数
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
//不输出header 头信息
curl_setopt($ch, CURLOPT_HEADER,0);
//不验证证书 信任任何证书
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 检查证书中是否设置域名,0不验证 0:不检查通用名称(CN)属性
1:检查通用名称属性是否存在
2:检查通用名称是否存在,是否与服务器的主机名称匹配
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
//设置 在HTTP请求中包含一个"User-Agent: "头的字符串
//curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);$res = curl_exec($ch);
$error_no = curl_errno($ch);
$info = curl_getinfo($ch);
$err_msg = '';
if ($error_no) {$err_msg = curl_error($ch);
} else {print_r($res);dump($info);
}
curl_close($ch);

注意:

  • curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); $postData为数组时Content-Type 头部会被设置为 multipart/form-data ,通过file_get_contents('php://input')获取不到post提交的到数据,通过$_POST 可以,$_FILES 可以获取数据

$ch = curl_init();
$curl_file1 = curl_file_create('C:/Users/shanghai/Pictures/Camera Roll/23.jpg', 'image/png', pathinfo('C:/Users/shanghai/Pictures/Camera Roll/23.jpg',PATHINFO_BASENAME));
$curl_file2 = curl_file_create('C:/Users/shanghai/Pictures/Camera Roll/66tyr.jpg', 'image/png', pathinfo('C:/Users/shanghai/Pictures/Camera Roll/66tyr.jpg',PATHINFO_BASENAME));$postData = ['file' => '111','text' => '666','file_name[0]'=>$curl_file1,'file_name[1]'=>$curl_file2,// 'file_name'=>$curl_file1 ,
];
curl_setopt($ch, CURLOPT_URL, 'xxx.com/test/curl');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);
// curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($postData));
// curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);$res = curl_exec($ch);
$error_no = curl_errno($ch);
$info = curl_getinfo($ch);
$err_msg = '';
if ($error_no) {$err_msg = curl_error($ch);
} else {print_r($res);// dump($info);
}
curl_close($ch);public function actionCurl()
{$request = Yii::$app->request;dump(file_get_contents('php://input'),$_FILES,$request->post(),$request->getContentType(),$request->getMethod());
}
  • curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); 这个参数值为urlencoded 后的字符串,类似'para1=val1&para2=val2&...'Content-Type 头部会被设置为 application/x-www-form-urlencoded ,通过file_get_contents('php://input')可以获取到post提交的到数据,通过$_POST 也可以,$_FILES 获取不到数据

  • 传递json参数

    $jsonData = '{"name":"xp","age":"18","sex":"男"}';
    $postData = [
    'file' => '111',
    'text' => '666','file_name[0]'=>$curl_file1,'file_name[1]'=>$curl_file2,
    // 'file_name'=>$curl_file1 ,
    ];
    $header = ['Content-Type: application/json','Content-Length:'.strlen($jsonData),
    ];
    curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
    // 设置Content-Type: application/json,传递数组数据时, 都获取不到数据,文件也获取不到
    //curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    //当不设置header 时
    curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
  1. 设置Content-Type: application/json,传递json数据参数时,file_get_contents('php://input')可以获取到数据,其他获取不到

  2. 不设置Content-Type: application/json,传递json数据参数时,传递file_get_contents('php://input')可以获取到数据,$_FILES获取不到 ,$_POST 获取到的是["{"name":"xp","age":"18","sex":"男"}" => ""]

  3. 设置Content-Type: application/json,传递数组参数时,获取不到参数

  • curl 多图上传时 ,传递的数组要加key
//像这样写可以获取到多图
$postData = ['file' => '111','text' => '666','file_name[0]'=>$curl_file1,'file_name[1]'=>$curl_file2,// 'file_name'=>$curl_file1 ,
];//这样写的话 后面的会覆盖前面的
$postData = ['file' => '111','text' => '666','file_name[]'=>$curl_file1,'file_name[]'=>$curl_file2,// 'file_name'=>$curl_file1 ,
];
  • 只有当 Content-Type:application/x-www-form-urlencoded 时 php://input 和$_POST都有数据;当Content-Type:multipart/form-data 时 php://input 获取不到数据,$_FILES 可以获取上传图片的信息,$_POST也有数据;当Content-Type:application/json 并且传递的是json 数据时 , php://input可以正常获取json 数据,$_POST获取不到;当Content-Type:text/xml php://input可以正常获取xml 数据,$_POST获取不到

php 通过curl上传图片相关推荐

  1. PHP5.6通过CURL上传图片@符无效的兼容问题

    今天本来想试试一个图片云的API,于是本地做了个上传图片的测试,结果灰常郁闷的发现以前一直用的好好的CURL上传图片居然死活不起作用,本来几分钟搞定的事情,结果折腾了大半天才终于找到原因,居然是兼容性 ...

  2. php curl post上传图片,php curl上传图片问题

    关于curl上传图片至微信 上传logo素材 接口.上传图片不成功,请问是什么问题? 我用的是5.6以上的PHP,图片路径给的相对的. 从网上找到一种curl的post请求方法 public func ...

  3. PHP cURL上传图片

    2019独角兽企业重金招聘Python工程师标准>>> 在PHP5.5之前的版本,curl上传文件的方法是使用 @+文件绝对路径 将post数组传递给 CURLOPT_POSTFIE ...

  4. PHP通过CURL上传图片(微信公众号上传素材)

    这里以微信公众号素材管理为例. PHP的cURL支持通过给CURL_POSTFIELDS传递关联数组(而不是字符串)来生成multipart/form-data的POST请求. 传统上,PHP的cUR ...

  5. 读书笔记:PHP和MySQL高性能应用开发 (2019.2.20-2019.3.4)

    1.emtpy.isset.is_null的区别 isset()检测一个变量是否已声明且值不为NULL,并且声名一个变量没有赋值也算false,但是空字符串或者空格为true   empty()用来检 ...

  6. 用php批处理图片,PHP中使用CURL发送get/post请求上传图片批处理功能

    cURL是利用url语法规定传输文件和数据的工具.php中有curl拓展,一般用来实现网络抓取,模拟发送get   post请求,文件上传. 在php中建立curl的基本步骤如下: 1.初始化 2. ...

  7. php curl post上传图片,PHP中使用CURL发送get/post请求上传图片批处理功能

    cURL是利用url语法规定传输文件和数据的工具.php中有curl拓展,一般用来实现网络抓取,模拟发送get   post请求,文件上传. 在php中建立curl的基本步骤如下: 1.初始化 2. ...

  8. php 中使用cURL发送get/post请求,上传图片,批处理

    https://mp.weixin.qq.com/s/8luqMEd8xt8oJxFLLCU1XA 文章正文 cURL是利用url语法规定传输文件和数据的工具.php中有curl拓展,一般用来实现网络 ...

  9. linux curl 使用详解 常见应用

    curl 1 http 超时 -m 指定超时的时间 等于--connect-timeout 2 输出到空 -o /dev/null 不输出,正常是输出html格式 3 -w 指定格式输出 4 -s 去 ...

最新文章

  1. 游戏通讯技术:帧同步技术
  2. 聊聊ribbon的超时时间设置
  3. linux mysql密码转义_linux忘记mysql密码处理方法
  4. 机器学习经典算法决策树原理详解(简单易懂)
  5. c语言实验交换字母,C语言实验内容.doc
  6. java关键字保留字_Java这个关键字
  7. PHP报错:Invalid body indentation level (expecting an indentation level of at least 4)
  8. html5编写软件哪个好?八款html5编写软件推荐
  9. gitlab无法推送
  10. GitLab实现CICD自动化部署
  11. 1v1微信聊天测试点
  12. 如何记忆和使用PNP和NPN?
  13. Ty-JDBC学习笔记
  14. 2022-2027年中国消防器材制造行业发展前景及投资战略咨询报告
  15. 优秀产品经理所需具备的7种能力
  16. ios手游退款有风险吗?
  17. java之旅(1)序言
  18. 注意力机制--CBAM的研究
  19. parametric bootstrap参数估计抽样方法的R实现
  20. 关于MAX3232ESE+T的过热问题

热门文章

  1. pgsql(PostgreSQL)常用命令行操作
  2. FullCalendar日历插件的简单使用(版本4.2.0)
  3. 软件配置管理和软件维护的区别
  4. 这款神奇的云端电脑可让你少装十几个软件
  5. Unity PureMVC框架案例
  6. 创建微信机器人和女朋友聊天_创建聊天机器人
  7. Android面试题-Activity
  8. 检验c语言程序是否正确的程序,c语言实习心得体会范文
  9. 求某门课号的成绩高于某个同学(例如李勇)任意一门成绩的学生学号和成绩
  10. Promethus(普罗米修斯)