上传图片先了解下php版本和curl先。
我的版本是php7,curl估计tp6带的
先讲讲我遇到的问题(我这里是上传到第三方的,我就不细说了)
1.curl 上传文件失败
2.curl 上传有传图片但是返回错误
现在来回答上面的两个问题
第一个(curl 上传文件失败)
这是因为php版本的问题貌似5.5以上跟5.5以下的不一致。我现在讲的是php7的
现在了解下函数CURLFile
CURLFile(‘图片路径’,‘Content-Type的格式’,‘文件名’)
这是正确的 post请求上传图片
第二个问题 curl 上传有传图片但是返回错误
这里就涉及到http协议和curl了,大家可以去了解下
这是为什么呢
因为我们在前面的
new \CURLFile()这里我们已经设置了content-type(对应第二个参数)和content-Disposition对应第三个参数)了
下面还有几个我在开发中遇到的小知识点(百度深似海,内容泛滥成灾)
curl的post请求大致分为两种 一种是数据请求,另一种是文件上传请求
第一种数据请求的几个关键点
1.http_build_query
2.json
第二种文件上传请求
因为我用的是php7的版本所以下面讲的都是php7的
第一部分是请求前的数据处理
public function up_img($url=null,$img=null){
// $post = array('img' => '@'.$img);
$img_name = basename($img);
$post = array( new \CURLFile(realpath($img),'image/jpeg',$img_name));
$headers = [
'Host:这里我删了',
'Connection: keep-alive',
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
'Accept: */*',
'X-Requested-With: XMLHttpRequest',
'Origin: 这里我删了',
'Cache-Control: no-cache',
'Sec-Fetch-Site:: same-origin',
'Sec-Fetch-Mode: cors',
'Sec-Fetch-Dest: empty',
'Accept-Encoding: gzip, deflate, br',
'Accept-Language: zh-CN,zh;q=0.9',
'Cookie:这里我删了'
];
$data = [
'url'=>$url,
'Referer'=>'这里我删了',
'headers'=>$headers,
'post'=>$post
];
$output = $this->CurlGetImg($data);//GETtcurl
var_dump($output);die();
$this->parse($output);
}
通用的curl请求
public function CurlGetImg($data=null)
{
isset($data['url']) ? $url=$data['url']:$url = '';//url
isset($data['headers']) ? $headers=$data['headers'] : $headers = '';//头部参数
isset($data['cookie']) ? $cookie=$data['cookie']:$cookie = '';//cookie设置
isset($data['Referer']) ? $Referer = $data['Referer']:$Referer = '';//referer
isset($data['text']) ? $text=true : $text = false;//需不需要正文
isset($data['post']) ?$post =$data['post'] : $post = '';//是不是post请求
$this->LocationUrlOld($data['url']);
$info = curl_init();
if($headers){
curl_setopt($info, CURLOPT_HEADER, true);
curl_setopt($info,CURLOPT_HTTPHEADER,$headers);
}
if($cookie){
curl_setopt($info, CURLOPT_COOKIE,$cookie);
}
if($Referer){
curl_setopt ($info, CURLOPT_REFERER, $Referer);
}
if($post){
// POST数据
curl_setopt($info, CURLOPT_POST, 1);
// 把post的变量加上
curl_setopt($info, CURLOPT_POSTFIELDS, $post );
}
curl_setopt($info,CURLOPT_SSL_VERIFYPEER,false);//禁用后cURL将终止从服务端进行验证
curl_setopt($info,CURLOPT_SSL_VERIFYHOST,false);//检查服务器SSL证书中是否存在一个公用名(common name)
curl_setopt($info,CURLOPT_PROXY,'127.0.0.1:8888');//设置代理服务器(不需要的可以删掉)
curl_setopt($info, CURLOPT_PROXYPORT, "80"); // 代理端口不需要的可以删掉)
curl_setopt($info, CURLOPT_RETURNTRANSFER,1);
curl_setopt($info,CURLOPT_CONNECTTIMEOUT,3600);//响应时长
if($text){
curl_setopt($info, CURLOPT_NOBODY, true);// 是否不需要响应的正文,为了节省带宽及时间,在只需要响应头的情况下可以不要正文
}
curl_setopt($info,CURLOPT_URL,$url);
$output = curl_exec($info);
$b = curl_errno($info);
curl_close($info);
if($b>0){
throw new \think\Exception('url请求错误'.$b, 10006);
}
return $output;
}
本文为原创内容,请爬文章的珍重,营造一个良好成长环境,转载请注明出处。