文链接: http://www.maoyupeng.com/wechart-upload-image-errorcode-41005.html

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三个版本都有所不同.下面我贴出一段上传图片代码,供大家参考(能兼容三个版本):

  1. $filepath = dirname ( __FILE__ ) . "/a.jpg";
  2. if (class_exists ( '\CURLFile' )) {//关键是判断curlfile,官网推荐php5.5或更高的版本使用curlfile来实例文件
  3. $filedata = array (
  4. 'fieldname' => new \CURLFile ( realpath ( $filepath ), 'image/jpeg' )
  5. );
  6. } else {
  7. $filedata = array (
  8. 'fieldname' => '@' . realpath ( $filepath )
  9. );
  10. }
  11. $url = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=" . $access_token . "&type=image";
  12. $result = Http::upload ( $url, $filedata );//调用upload函数
  13. if (isset ( $result )) {
  14. $data = json_decode ( $result );
  15. if (isset ( $data->media_id )) {
  16. $this->responseText ( $data->media_id );//这是我自己封装的返回消息函数
  17. } else {
  18. $this->responseImg ( "not set media_id" );//这是我自己封装的返回消息函数
  19. }
  20. } else {
  21. $this->responseText ( "no response" );//这是我自己封装的返回消息函数
  22. }
  1. public static function upload($url, $filedata) {
  2. $curl = curl_init ();
  3. if (class_exists ( '/CURLFile' )) {//php5.5跟php5.6中的CURLOPT_SAFE_UPLOAD的默认值不同
  4. curl_setopt ( $curl, CURLOPT_SAFE_UPLOAD, true );
  5. } else {
  6. if (defined ( 'CURLOPT_SAFE_UPLOAD' )) {
  7. curl_setopt ( $curl, CURLOPT_SAFE_UPLOAD, false );
  8. }
  9. }
  10. curl_setopt ( $curl, CURLOPT_URL, $url );
  11. curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, FALSE );
  12. curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, FALSE );
  13. if (! empty ( $filedata )) {
  14. curl_setopt ( $curl, CURLOPT_POST, 1 );
  15. curl_setopt ( $curl, CURLOPT_POSTFIELDS, $filedata );
  16. }
  17. curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 );
  18. $output = curl_exec ( $curl );
  19. curl_close ( $curl );
  20. return $output;
  21. }

最新文章

  1. linux重启mysql无法启动
  2. pygame开发PC端微信打飞机游戏
  3. Dimmer: 通过移动鼠标来改变 LED 的亮度
  4. sg函数与博弈论
  5. webpack我遇到的一些坑
  6. JQuery判断checkbox是否选中-批量
  7. 启动BPM的5个步骤
  8. Apache配置站点根目录、用户目录及页面访问属性
  9. 006 [翻译] Haneke(一个Swfit iOS缓存类)
  10. 使用logminer分析日志文件
  11. 如何让 Qt 的程序使用 Sleep(主线程没有Sleep函数,但线程可用自带的保护函数Sleep)
  12. linux环境下java读取sh脚本并执行
  13. hadoop问题: bin/hadoop fs -ls ls: `.&#39;: No such file or directory
  14. ASP.NET MVC从视图传参到控制器的几种形式
  15. SpringMVC与Struts不同(五)
  16. php代码覆盖率执行
  17. c#类 对象 构造函数 析构函数——面向对象
  18. Unity资源Assetbundle
  19. Knockout学习之监控属性
  20. mysql5.7创建用户授权删除用户撤销授权

热门文章

  1. python 学习中遇到的问题
  2. SPSS数据分析—单因素及多因素方差分析
  3. linux hugepage
  4. WebView注入Java对象注意事项
  5. iOS开发网络篇—GET请求和POST请求
  6. Install Java1.6
  7. juery常用
  8. 利用ftp端口设置,浅谈windows防火墙之应用+ftp直接资源管理器登陆
  9. (转)JQM 日期插件 mobiscroll Demo
  10. android sdk 更新用的HOSTS