内容纲要
最近在研究微信公众平台开发,感觉还是蛮有意思的,今天项目中需要上传语音文件到微信服务器,然后再发送给用户的功能.网上有很多这方面的代码,用了很多个版本都不能实现上传.下面是网上的版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$type = "voice"; $filepath = dirname(__FILE__)."\amr\sdya.amr"; $filedata = array("media" => "@".$filepath); $access_token = 'aaaaaaa'; $url = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=$access_token&type=$type"; $result = wx_upload_media($url, $filedata); var_dump($result); function wx_upload_media($url, $data = null){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($data)){ curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return $output; } |
经过种种尝试各种折腾发现然并卵!!!!!
后面一查手册,小伙伴们都惊呆了!!!
PHP 5.5另外引入了CURL_SAFE_UPLOAD
选项,可以强制PHP的cURL模块拒绝旧的@
语法,仅接受CURLFile式的文件。5.5的默认值为false,5.6的默认值为true。
于是乎,加上这个参数试了一下,very good,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$type = "voice"; $filepath = dirname(__FILE__)."\amr\sdya.amr"; $filedata = array("media" => "@".$filepath); $access_token = 'aaaa'; $url = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=$access_token&type=$type"; $result = wx_upload_media($url, $filedata); var_dump($result); function wx_upload_media($url, $data = null){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($curl, CURLOPT_SAFE_UPLOAD, FALSE); if (!empty($data)){ curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return $output; } |
不细看的同学可能会发现两段代码不是一样的吗?如果真是这样,那你就再仔细看一下吧!
当然,还有另外一种方式,就是用官方推荐的CURLFile类来获取文件.
1 |
$filedata = array('media' => new CURLFile($filepath)); |