使用微信接口上传图片文件素材,老是报如下错误:
网上搜了搜,遇到这个坑的人很多,自己捣鼓了一会儿,也终于解决了。
先贴一下构造的curl请求函数:
function _request($curl,$https=true,$method='GET',$data=null){
//1.创建一个新cURL资源
$ch = curl_init();
//2.设置URL和相应的选项
//要访问的网站
curl_setopt($ch, CURLOPT_URL, $curl);
//启用时会将头文件的信息作为数据流输出。
curl_setopt($ch, CURLOPT_HEADER, false);
//将curl_exec()获取的信息以字符串返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if($https){
//FALSE 禁止 cURL 验证对等证书(peer's certificate)。
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); //验证主机
}
if($method == 'POST'){
//发送 POST 请求
curl_setopt($ch, CURLOPT_POST, true);
//全部数据使用HTTP协议中的 "POST" 操作来发送。
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
//3.抓取URL并把它传递给浏览器
$content = curl_exec($ch);
if ($content === false) {
return "网络请求出错: " . curl_error($ch);
exit();
}
//4.关闭cURL资源,并且释放系统资源
curl_close($ch);
return $content;
}
/**
* 上传图片,本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。
* 图片仅支持jpg/png格式,大小必须在1MB以下。 (认证后的订阅号可用)
* 注意:上传大文件时可能需要先调用 set_time_limit(0) 避免超时
* 注意:数组的键值任意,但文件名前必须加@,使用单引号以避免本地路径斜杠被转义
* @param array $data {"media":'@Path/filename.jpg'}
* @return boolean|array
*/
public function uploadImg($data){
if (!$this->_getAccessToken()) return false;
$curl = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token='.$this->_getAccessToken();
$result = $this->_request($curl,true,'POST',$data);
if ($result){
$json = json_decode($result,true);
/* if (!$json || !empty($json['errcode'])) {
$this->errCode = $json['errcode'];
$this->errMsg = $json['errmsg'];
return false;
} */
return $json;
}
return false;
}
$wechat = new Wechat($appid,$appsecret,$token);
$data = array('media'=>'@images/3.jpg');
$result = $wechat->uploadImg($data);
print_r($result);
*另外,我这里PHP版本是php5.5.1,这样处理没问题,不过网上说从php5.6以后需要在curl请求函数加上curl_setopt ( $ch, CURLOPT_SAFE_UPLOAD, false);这行代码方可上传,否则取不到文件。(这个我木有试,php5.6以上的老铁可以试试)
注意:curl_setopt ( $ch, CURLOPT_SAFE_UPLOAD, false);这行代码必须放在下面这行代码之前curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields );否则上传错误。
下面这篇文章讲了如何在Php5.6中用@加文件名的方式传文件
参考:http://blog.csdn.net/ligaofeng/article/details/39291185
如果以上都不能解决,就要好好检查一下文件路径是否写对了。