PHP5.6及以上如何使用cURL进行模拟post文件

LEO-屹铭 2020-08-16 AM 522℃ 0条

由于最近在研究图床,看到SM的图床不错,就想着把图片传到sm上去,代码如下:

<?php
function post($url, $data) {
//模拟POST上传图片和数据
//定义Cookie存储路径必须使用绝对路径
$cookie_jar= dirname(__FILE__)."/pic.cookie"
$UserAgent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)';
//获取Cookie,将cookie存入文
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
$content = curl_exec($ch);
curl_close($ch);
   //初使化init方法
   $ch = curl_init();
   //指定URL
   curl_setopt($ch, CURLOPT_URL, $url);
   //设定请求后返回结果
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   //声明使用POST方式来进行发送
   curl_setopt($ch, CURLOPT_POST, 1);
   //加入Cookie
   curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);
   //发送的数据
   curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
   //忽略ssl证书
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
   //忽略header头信息
   curl_setopt($ch, CURLOPT_HEADER, 0);
   curl_setopt($ch, CURLOPT_USERAGENT, $UserAgent);
   //设置超时时间
   curl_setopt($ch, CURLOPT_TIMEOUT, 30);
   //发送请求
   $output = curl_exec($ch);
   //关闭curl
   curl_close($ch);
   //返回数据
   return $output;
}
$post_data = array('smfile' => '@/logo.png');
//需要上传的文件
$url = 'https://sm.ms/api/upload';//sm的地址
echo post($url, $data);
?>

结果在EP主机上测试一切正常,放到宝塔主机上使用就一直报错。
1_4AVVEYUGVHDJCEA.jpg
研究好久发现PHP5.6及以上版本已经不能@的方法post文件需要用到 CURLFile( )这个函数,于是我改了代码,果然出现下边的样子,大功告成。
php_curl_post.jpg
只要将
array('smfile' => '@/logo.png');
成成
array('smfile' =>new CURLFile(realpath("logo.png")));
//realpath("logo.png")获取文件真实路径
就好啦。


扫描二维码,在手机上阅读!
标签: PHP

非特殊说明,本博所有文章均为博主原创。

评论啦~