ホームページ バックエンド開発 PHP7 php7でcurlファイルのアップロードでエラーが発生した場合はどうすればよいですか?

php7でcurlファイルのアップロードでエラーが発生した場合はどうすればよいですか?

Aug 13, 2021 am 09:20 AM

この記事ではphp7でのcurlファイルのアップロードエラーの解決方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)