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

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

醉折花枝作酒筹
リリース: 2023-02-18 07:56:01
転載
2717 人が閲覧しました

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

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート