php:微信公众平台上传多媒体接口 41005错误
2023-09-14 08:57:51 时间
亲测可用。
PHP的cURL支持通过给CURL_POSTFIELDS
传递关联数组(而不是字符串)来生成multipart/form-data
的POST请求。
传统上,PHP的cURL支持通过在数组数据中,使用“@
+文件全路径”的语法附加文件,供cURL读取上传。这与命令行直接调用cURL程序的语法是一致的:
curl_setopt(ch, CURLOPT_POSTFIELDS, array(
'file' => '@'.realpath('image.png'),
));
equals
$ curl -F "file=@/absolute/path/to/image.png" <url>
但PHP从5.5开始引入了新的CURLFile类用来指向文件。CURLFile类也可以详细定义MIME类型、文件名等可能出现在multipart/form-data数据中的附加信息。PHP推荐使用CURLFile替代旧的@
语法:
curl_setopt(ch, CURLOPT_POSTFIELDS, [
'file' => new CURLFile(realpath('image.png')),
]);
PHP 5.5另外引入了CURL_SAFE_UPLOAD
选项,可以强制PHP的cURL模块拒绝旧的@
语法,仅接受CURLFile式的文件。5.5的默认值为false,5.6的默认值为true。
微信公众号多媒体上传接口返回码出现41005的原因就是不能识别文件.
归根到底,可能开发者没有太在乎php版本之间的更新和差异,所以导致在低版本的php环境开发的,然后部署到高版本的环境中.
需要注意的是php5.4 php5.5 php5.6三个版本都有所不同.下面我贴出一段上传图片代码,供大家参考(能兼容三个版本):
$filepath = dirname ( __FILE__ ) . "/a.jpg"; if (class_exists ( '\CURLFile' )) {//关键是判断curlfile,官网推荐php5.5或更高的版本使用curlfile来实例文件 $filedata = array ( 'fieldname' => new \CURLFile ( realpath ( $filepath ), 'image/jpeg' ) ); } else { $filedata = array ( 'fieldname' => '@' . realpath ( $filepath ) ); } $url = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=" . $access_token . "&type=image"; $result = Http::upload ( $url, $filedata );//调用upload函数 if (isset ( $result )) { $data = json_decode ( $result ); if (isset ( $data->media_id )) { $this->responseText ( $data->media_id );//这是我自己封装的返回消息函数 } else { $this->responseImg ( "not set media_id" );//这是我自己封装的返回消息函数 } } else { $this->responseText ( "no response" );//这是我自己封装的返回消息函数 }
public static function upload($url, $filedata) { $curl = curl_init (); if (class_exists ( '/CURLFile' )) {//php5.5跟php5.6中的CURLOPT_SAFE_UPLOAD的默认值不同 curl_setopt ( $curl, CURLOPT_SAFE_UPLOAD, true ); } else { if (defined ( 'CURLOPT_SAFE_UPLOAD' )) { curl_setopt ( $curl, CURLOPT_SAFE_UPLOAD, false ); } } curl_setopt ( $curl, CURLOPT_URL, $url ); curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, FALSE ); if (! empty ( $filedata )) { curl_setopt ( $curl, CURLOPT_POST, 1 ); curl_setopt ( $curl, CURLOPT_POSTFIELDS, $filedata ); } curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 ); $output = curl_exec ( $curl ); curl_close ( $curl ); return $output; }
或者更简单的方法:
function curl_post($url, $data, $header = array()){ if(function_exists('curl_init')) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); if(is_array($header) && !empty($header)){ $set_head = array(); foreach ($header as $k=>$v){ $set_head[] = "$k:$v"; } curl_setopt($ch, CURLOPT_HTTPHEADER, $set_head); } curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 0);// 1s to timeout. $response = curl_exec($ch); if(curl_errno($ch)){ //error return curl_error($ch); } $reslut = curl_getinfo($ch); print_r($reslut); curl_close($ch); $info = array(); if($response){ $info = json_decode($response, true); } return $info; } else { throw new Exception('Do not support CURL function.'); } }
调用:
$file = "a.jpg"; $data = array( 'media'=> new CURLFile($file) ); $result = $this->curl_post(self::WEIXIN_API . 'media/upload?access_token=' . $this->get_access_token($app_id, $app_secret) . '&type=' . $type ,$data);
相关文章
- 宽带连接错误的处理办法
- Java后台接收参数出现java.lang.Integer cannot be cast to java.lang.Double错误(已解决)[通俗易懂]
- WRF讲解——CFL 错误、SIGSEGV 段错误以及挂起或停止
- 域名系统DNS用来解析_网页域名解析错误怎么办
- 【php】关闭PHP错误提示方法,防止错误信息泄露
- SQLServer 错误 5120 表错误:无法打开物理文件 “%.*ls”。 操作系统错误 %d: “%ls”。 故障 处理 修复 支持远程
- PHP与MySQL融合,尽享轻松开发(php与mysql整合)
- 错误解决Oracle数据库ORA4063错误(oracle-4063)
- Linux系统下搜索PHP文件的技巧(linux查找php文件)
- PHP failed to ptrace(PEEKDATA) pid 13659: Input/output error错误解决方法详解编程语言
- 安装完美:PHP与MySQL的默契(php和mysql安装)
- 五大物联网网络安全错误
- PHP在Linux中的路径指引(php路径linux)
- PHP调用MSSQL数据库:开启新的数据库探索(用php调用mssql)
- 解决Oracle00604错误办法(oracle-00604)
- Oracle出示错误恐慌状态(oracle出现系统错误)
- MySQL中的错误代码2008如何修复(mysql中2008错误)
- 如何使用Redis技术来优化PHP性能(清楚redis php)
- oracle 28024错误解决之道(oracle28024)
- PHP错误之引号中使用变量
- PHP和Mysqlweb应用开发核心技术第1部分Php基础-1开始了解php
- php入门学习知识点三PHP上传
- IIS7使用.NETFrameworkv4.0运行库报500错误的解决办法