当前位置 博文首页 > 文章内容

    php7中的curl文件上传出现错误该怎么办

    作者:shunshunshun18 栏目:未分类 时间:2021-08-13 10:45:01

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    本篇文章给大家介绍一下解php7中curl文件上传出现错误的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

    最近在项目跟微信公众号的素材库对接接口,采用curl的post方式提交素材文件,发现一直提示

    {“errcode”:41005,”errmsg”:”media data missing”}

    代码内容

    $url = self::$add_material . $accessToken . '&type=' . $key;
    $data = [
                'media' => '@' . $fileName,
                'form-data' => $fileInfo,
                'description' => json_encode([
                    'title' => $fileName,
                    'introduction' => ''
                ]),
            ];
    self::init($url);
    $data = is_array($data) ? http_build_query($data) : $data;
    curl_setopt(self::$curl, CURLOPT_POST, 1);
    curl_setopt(self::$curl, CURLOPT_POSTFIELDS, $data);
    $info = curl_exec(self::$curl);
    curl_close(self::$curl);

    查阅了官方文档 在php5.5后不再支持@,必须要使用CurlFile或者设置CURLOPT_SAFE_UPLOAD为1

    There are “@” issue on multipart POST requests.
    Solution for PHP 5.5 or later:
    Enable CURLOPT_SAFE_UPLOAD.
    Use CURLFile instead of “@”.

    在php7 curl如果改变CURLOPT_SAFE_UPLOAD会提示一个错误 如下:

    curl_setopt(): Disabling safe uploads is no longer supported in 报错

    我们只能老老实实使用CurlFile来处理

    $url = self::$add_material . $accessToken . '&type=' . $key;
    $data = [
                'media' => new \CURLFile($fileName),
                'form-data' => $fileInfo,
                'description' => json_encode([
                    'title' => $fileName,
                    'introduction' => ''
                ]),
            ];
    self::init($url);
    $data = is_array($data) ? http_build_query($data) : $data;
    curl_setopt(self::$curl, CURLOPT_POST, 1);
    curl_setopt(self::$curl, CURLOPT_POSTFIELDS, $data);
    $info = curl_exec(self::$curl);
    curl_close(self::$curl);

    然后发现这样写三个大坑(是我自己蠢)

    1、如果CURLOPT_POSTFILEDS传入的是数组 content_type就为multipart/form-data;如果CURLOPT_POSTFILEDS传入的是json或者key-value& content_type就为x-www-form_urlencoded;但是微信支持form-data传递的数组

    2、数组里面如果有包含对象对其进行http_build_query会将其改成数组

    3、CurlFile只能读取服务器内的路径,如果要上传网上的地址,需要先下载到服务器的临时目录,在通过CurlFile读取文件路径(绝对路径)

    所以我们接着调整代码

    $url = self::$add_material . $accessToken . '&type=' . $key;
    $data = [
                'media' => new \CURLFile($fileName),
                'form-data' => $fileInfo,
                'description' => json_encode([
                    'title' => $fileName,
                    'introduction' => ''
                ]),
            ];
    self::init($url);
    curl_setopt(self::$curl, CURLOPT_POST, 1);
    curl_setopt(self::$curl, CURLOPT_POSTFIELDS, $data);
    $info = curl_exec(self::$curl);
    curl_close(self::$curl);

    正当我以为我可以解脱的时候,php7这里弹出一个notice语法错误:

    Array to string conversion

    然后查阅了资料 发现CURLOPT_POSTFIEDLDS不支持多维数组

    但是提示的notice的语法错误,我们完全可以进行屏蔽

    继续调整代码

    $url = self::$add_material . $accessToken . '&type=' . $key;
    $data = [
                'media' => new \CURLFile($fileName),
                'form-data' => $fileInfo,
                'description' => json_encode([
                    'title' => $fileName,
                    'introduction' => ''
                ]),
            ];
    self::init($url);
    curl_setopt(self::$curl, CURLOPT_POST, 1);
    @curl_setopt(self::$curl, CURLOPT_POSTFIELDS, $data);
    $info = curl_exec(self::$curl);
    curl_close(self::$curl);

    结果终于上传素材成功了

    抬头一望 天已黑

    开心我赶紧一边擦鼻涕一边收拾东西下班

    推荐学习: