• php:微信公众平台上传多媒体接口 41005错误


    亲测可用。

    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);
    

      

  • 相关阅读:
    FFmpeg软件只是个解码编码软件,如果支持多种格式必须先安装好对应的库,下面就说下我装的库
    在Centos 6.5 X64下切割m3u8
    扩展自己的数组核心库
    关于小周同志在消息模块定位功能修改时存在的问题分析
    比对两个Word文件内容是否一致的C#解决办法
    如何实现artTemplate模板的可重用性,以此框架打造自己的自定义组件
    稍微谈一下 javascript 开发中的 MVC 模式
    Node.js 函数
    Node.js模块系统
    Node.js Stream(流)
  • 原文地址:https://www.cnblogs.com/achengmu/p/7930468.html
Copyright © 2020-2023  润新知