PHP curl 模拟表单数据流multipart/form-data上传文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP curl 模拟表单数据流multipart/form-data上传文件相关的知识,希望对你有一定的参考价值。

参考技术A 在调用公众号接口https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=".$token."&type=".$type;

上传永久素材文件总是返回 "\"errcode\":41005,\"errmsg\":\"media data missing\""

经过多次测试使用下面的方式,可以正常上传

//调用测试

protected static $url;

protected static $delimiter;

protected static $instance;

public function index()



        static::$delimiter = uniqid();

$basename = Request::instance()->root();

if (pathinfo($basename, PATHINFO_EXTENSION) == 'php')

    $basename = dirname($basename);



        $result=$this->wxAddMaterial($token,$basename.'/upload/images/gnlog.jpg','image');

   

// 新增其他类型永久素材

public function wxAddMaterial($token,$filename='',$type='')

    // 设置请求参数

    static::$url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=".$token."&type=".$type;

    $filePath = str_replace('\\', '/', $filename);

    // 发送请求

    $imginfo=pathinfo($filePath);

    $fields = array(

        'media'=>file_get_contents(".".$filePath),

        'filename'=>$imginfo["basename"],

);

    $res = $this->putPart( $fields);

    // 发送请求

    return $res;



//推送文件流

public function putPart($param)

    $post_data = static::buildData($param);

    $curl = curl_init(static::$url);

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($curl, CURLOPT_POST, true);

    curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);

    curl_setopt($curl, CURLOPT_HTTPHEADER, [

        "Content-Type: multipart/form-data; boundary=" . static::$delimiter,

        "Content-Length: " . strlen($post_data)

]);

    $response = curl_exec($curl);

    curl_close($curl);

    return $response;



//编译请求头格式和数据流

private static function buildData($param)

    $data = '';

    $eol = "\r\n";

    $upload = $param['media'];

    unset($param['media']);

    foreach ($param as $name => $content)

        $data .= "--" . static::$delimiter . "\r\n"

            . 'Content-Disposition: form-data; name="' . $name . "\"\r\n\r\n"

            . $content . "\r\n";



    $data .= "--" . static::$delimiter . $eol

        . 'Content-Disposition: form-data; name="media"; filename="' . $param['filename'] . '"' . "\r\n"

        . 'Content-Type:application/octet-stream'."\r\n\r\n";

    $data .= $upload . "\r\n";

    $data .= "--" . static::$delimiter . "--\r\n";

    return $data;



根据自己的实际情况稍作修改

以上是关于PHP curl 模拟表单数据流multipart/form-data上传文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 HTML 表单、cURL 和 PHP 将文件上传到 Imageshack API

请教用Curl 在php 里面模拟表单提交 文本+文件的写法

php curl请求

PHP 中的CURL 模拟表单的post提交

PHP 中的CURL 模拟表单的post提交

php 使用curl 进行简单模拟提交表单