首頁 後端開發 PHP7 php7中的curl檔案上傳出現錯誤該怎麼辦

php7中的curl檔案上傳出現錯誤該怎麼辦

Aug 13, 2021 am 09:20 AM

這篇文章要為大家介紹解php7中curl檔案上傳出現錯誤的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

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. ## inse CULOAD. “@”.

在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);
登入後複製
結果終於上傳素材成功了 

抬頭一望天已黑 

開心我趕緊一邊擦鼻涕一邊收拾東西下班

#推薦學習:

php影片教學#

以上是php7中的curl檔案上傳出現錯誤該怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)