この記事では、主に、PHP 5.0 ~ 5.6 のさまざまなバージョンの互換性の cURL ファイル アップロード機能を紹介し、PHP のさまざまな一般的なバージョンの CURL ファイル アップロード操作に関連する実装スキルと注意事項を例の形で分析します。次へ
この記事の例では、PHP5.0 ~ 5.6 の各バージョンの cURL ファイルアップロード機能の互換性を分析します。参考のために皆さんと共有してください。詳細は次のとおりです。
最近の要件は、PHP を通じて cURL を呼び出して、multipart/form-data 形式でファイルをアップロードすることです。いくつかの落とし穴があれば、記事としては十分です。
#重要な警告
PHP の中国語の公式ドキュメントは読まないでください。バージョンが追いつかないと死んでしまいます!PHP の異なるバージョン間の cURL の違い
PHP の cURL は、連想配列をCURL_POSTFIELDS に渡すことをサポートしています(その間文字列ではありません) を使用して、
multipart/form-data に対する POST リクエストを生成します。
curl_setopt(ch, CURLOPT_POSTFIELDS, array( 'file' => '@'.realpath('image.png'), ));
$ curl -F "file=@/absolute/path/to/image.png" <url>
しかし、PHP は 5.5 以降、ファイルを指すための新しい CURLFile クラスを導入しました。 CURLFile クラスは、multipart/form-data データに表示される MIME タイプ、ファイル名などの追加情報を詳細に定義することもできます。 PHP では、古い
@ 構文の代わりに CURLFile を使用することをお勧めします。
curl_setopt(ch, CURLOPT_POSTFIELDS, [ 'file' => new CURLFile(realpath('image.png')), ]);
CURL_SAFE_UPLOAD オプションも導入されています。これにより、PHP の cURL モジュールが古い
@ 構文を拒否し、CURLFile スタイルのファイルのみを受け入れるように強制できます。デフォルト値は、5.5 の場合は false、5.6 の場合は true です。
@ 構文は 5.5 で非推奨となり、5.6 では直接削除されました (ElorException が生成されます:
@ filename の使用法)ファイルアップロード用の API は廃止されました。代わりに CURLFile クラスを使用してください。
CURL_SAFE_UPLOAD を手動で false に設定しても意味がありません。これは文字通り「安全でない古いメソッドを有効にするために false に設定する」とは理解されません。古いメソッドは廃止された構文として完全に存在しなくなりました。
PHP 5.6 == CURLFile のみ、幻想を抱かないでください。
@Syntax のみ ) ですが、開発環境は 5.6 (CURLFile のみ) です。どちらも、両方がサポートする移行バージョンである 5.5 には焦点を当てていないため、環境判断を備えた 2 セットのコードを作成する必要があります。
ここで問題が起こります...環境判断: マジックナンバーに注意してください!
この種の環境判断コードを見たことがあります:if (version_compare(phpversion(), '5.4.0') >= 0)
@ 構文に戻らずに、最初に CURLFile を使用することです。次にコードが続きます:
if (class_exists('\CURLFile')) { $field = array('fieldname' => new \CURLFile(realpath($filepath))); } else { $field = array('fieldname' => '@' . realpath($filepath)); }
推奨される明示的に指定された劣化オプション
From a信頼性の高い観点から、CURL_SAFE_UPLOAD の値を指定して、古い
@ 構文を許容するか禁止するかを PHP に明確に指示することをお勧めします。
CURLOPT_SAFE_UPLOAD 定数自体は、PHP の以前のバージョンには存在しない可能性があることに注意してください。
if (class_exists('\CURLFile')) { curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); } else { if (defined('CURLOPT_SAFE_UPLOAD')) { curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); } }
## を判断する必要があります。 #cURL オプションの設定 順序
curl_setopt()single または curl_setopt_array()
batch のどちらであっても、cURL オプションは常に 1 に設定されます。 1 つずつ変更すると有効になり、オプションを設定すると、後続のオプションを設定するときの cURL の動作にすぐに影響します。 たとえば、
は、CURLOPT_POSTFIELDS
の動作に関連しています。 CURLOPT_POSTFIELDS
が最初に設定され、次に CURLOPT_SAFE_UPLOAD
が設定された場合、後者の制約は有効になりません。なぜなら、前者を設定すると、cURL はデータの実際の読み取りと処理をすでに完了しているからです。 cURL には、この落とし穴のあるオプションがいくつかあるため、注意してください。幸いなことに、この種の「依存関係」には選択肢は多くなく、仕組みも複雑ではないため、簡単に扱うことができます。私の方法は、最初にすべてのオプションをバッチで設定し、次に
シングルショット設定 CURLOPT_POSTFIELDS
を curl_exec()
の直前まで使用することです。 <p>実際、<code>curl_setopt_array()
で使用される配列では、後方の CURLOPT_POSTFIELDS
の位置も信頼できることが保証されています。 PHP の連想配列はシーケンシャルであることが保証されており、curl_setopt_array()
の内部実行順序は最初から最後まで順番である必要があると仮定することもできます (そう仮定するのが良いことではないことはわかっていますが、一部は正しいと仮定します)。単純すぎますので、最低限の主張はしておきます)ので、ご安心ください。
私のアプローチは、コードのパフォーマンスにさらなる保険を追加し、将来の不正行為を防ぐための順序の重要性を強調することです。
名前空間
PHP バージョン 5.2 以前には名前空間がありません。コード内でスペース区切り文字 \
が使用されている場合、パーサー エラーが発生します。 PHP 5.2 を扱うのは実際には簡単で、名前空間を放棄するだけです。
注目すべきは、名前空間を備えた PHP 5.3 です。 CURLFile を呼び出すか、class_exists()
を使用して CURLFile の存在を確認するかにかかわらず、コードがクラッシュするのを防ぐために、トップレベルのスペースを明確に指定するために \CURLFile
を記述することをお勧めします。名前空間にラップされます。
php5 および php7 と互換性のある cURL ドキュメントPHP ブロック クエリ実装方法の分析
phpスキルファイルアップロード機能のインスタンス解析phpスキル
以上がPHP5.0~5.6 各バージョンの互換性 cURLファイルアップロード機能例分析 PHPスキルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。