この記事ではphp7でのcurlファイルのアップロードエラーの解決方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
最近、プロジェクトが WeChat パブリック アカウントのマテリアル ライブラリ インターフェイスに接続されているときに、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 に設定する必要があります。
マルチパート POST リクエストで「@」の問題が発生します。
PHP 5.5 の解決策または後で:
CURLOPT_SAFE_UPLOAD を有効にします。
"@" の代わりに CURLFile を使用します。
php7curl では、CURLOPT_SAFE_UPLOAD を変更すると、次のようなエラーが表示されます:
curl_setopt(): 安全なアップロードの無効化はエラーでサポートされなくなりました
これを正直に処理するには 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);
そして、このような記述で 3 つの大きな落とし穴を発見しました (私は愚かです)
1. CURLOPT_POSTFILEDS が配列の場合、content_type は multipart/form-data で渡される場合、CURLOPT_POSTFILEDS が json または key-value & content_type で渡される場合、それは x- www-form_urlencoded; ただし、WeChat は 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 で通知構文エラーがポップアップ表示されました:
Array to string変換
その後、情報を確認したところ、CURLOPT_POSTFIEDLDS は多次元配列をサポートしていないことがわかりました。
しかし、通知に含まれる構文エラーはプロンプトに表示されます。これは完全にブロックできます。
Continueコードを調整するための
$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 中国語 Web サイトの他の関連記事を参照してください。