文链接: 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. }

php 微信公众平台上传多媒体接口 41005错误的更多相关文章

  1. 微信公众平台上如何上传excel表格?

    微信公众平台上如何上传excel表格?   我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. ...

  2. Java 微信公众号上传永久素材的方法

    Java 微信公众号上传永久素材的方法 学习了:http://blog.csdn.net/u013791374/article/details/53258275 膜拜一下,源码如下: @Request ...

  3. C#微信公众平台开发—高级群发接口

    涉及access_token的获取请参考<C#微信公众平台开发—access_token的获取存储与更新> 一.为了实现高级群发功能,需要解决的问题 1.通过微信接口上传图文消息素材时,J ...

  4. PHP微信公众平台开发1 配置接口

    1.简介 微信公众平台是腾讯公司在微信的基础上新增的功能模块,通过这一平台,个人和企业都可以打造一个微信的公众号,并实现和特定群体的文字.图片.语音的全方位沟通.互动. 2.通讯机制 3.注册微信公众 ...

  5. Java微信公众平台开发(八)--多媒体消息回复

    转自:http://www.cuiyongzhi.com/post/46.html 之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复[普通消息类型消息],这里将讲述多媒体消 ...

  6. Java微信公众平台开发(七)--多媒体消息回复之图片回复

    之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复[普通消息类型消息],这里将讲述多媒体消息的回复方法,[多媒体消息]包含回复图片消息/回复语音消息/回复视频消息/回复音乐消 ...

  7. Java微信公众平台开发(八)--多媒体消息回复之音乐

    我们上一篇写了关注出发图片的回复.想着在发送一次音乐,最后基于回复消息分类情况下,实现一个简单的只能话回复.先附一张大致效果图. 下面我们进入代码阶段. (一)修改消息转发器MsgDispatcher ...

  8. NET实现微信公共平台上传下载多媒体文件(转)

    举个例子,有人对着我们的公共微信号拍个照片发送过来,然后我们处理这个照片,比如进行ocr识别字(随后就会降到这个例子),或者人脸识别,或者拍照取证等,这些功能都是相当有用的.那么我们现在就要分析一下这 ...

  9. 怎么在微信公众号上传PPT?

    我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. 以下是公众号添加附件使用“微附件”小程序的教 ...

随机推荐

  1. laravel Ajax post方式的使用

    以jquery ajax 的post的方式为例 验证邮箱输入格式是否正确 html <div class="fl"> <input type="emai ...

  2. DOM遍历方法

    为标题行添加样式 $(document).ready(function(){ $('th').parent().addClass('table-heading'); $('tr:not([th]):o ...

  3. Selenium操作页面元素

    转自:http://blog.sina.com.cn/s/blog_6966650401012a7q.html 一.输入框(text field or textarea) //找到输入框元素: Web ...

  4. Yii1.1.16的安装(windows)

    下载yii1.1.16 http://pan.baidu.com/s/1mgyAOnI 解压后放到D盘,并重新命名为yii1.1.16,我是直接放在开发的目录下面 按"Window + R& ...

  5. at

    1.这个命令对于自己建立的虚拟机很有帮助,比如你想过半个小时关机: [root@oc3408554812 ~]# at now + 30 minutesat> cd /tmp -h nowat& ...

  6. Windows Server 2003从入门到精通之Windows Media Server流媒体服务器架建[转]

    今天我们来做一个windows media server流媒体格式文件的流媒体服务器. 现在市面上能够买到的一些电影文件有 rm格式和wmv格式.还有一些是DivX技术的avi格式,要想让你的服务器对 ...

  7. canvas 利用canvas中的globalCompositeOperation 绘制刮奖 效果

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...

  8. 关于DButils的简单介绍

    android中的orm框架,一行代码就可以进行增删改查:支持事务,默认关闭:可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名)等等 ...

  9. C++二进制文件中读写bitset

    这个比较简单,直接上代码: bitset< > *b = >(); bitset< > *c = >(); ofstream out("I:\\test. ...

  10. 黑马程序员——OC语言 类和对象

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)类 1)类的声明 代码编写 ①定义一个Car类,拥有2个属性:轮子数 ...