PHP5.0~5.6 Kompatibilität verschiedener Versionen der Funktion zum Hochladen von cURL-Dateien

不言
Freigeben: 2023-03-29 06:50:01
Original
1511 Leute haben es durchsucht

In diesem Artikel wird hauptsächlich die Funktion zum Hochladen von Curl-Dateien in Bezug auf die Kompatibilität verschiedener Versionen von PHP5.0 bis 5.6 vorgestellt und anhand von Beispielen die relevanten Implementierungsfähigkeiten und Vorsichtsmaßnahmen für den Hochladevorgang für Curl-Dateien verschiedener gängiger PHP-Versionen analysiert . Freunde in Not können darauf verweisen.

Das Beispiel dieses Artikels analysiert die Kompatibilität der cURL-Datei-Upload-Funktion jeder Version von PHP5.0~5.6. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Eine aktuelle Anforderung besteht darin, cURL über PHP aufzurufen, um Dateien im Multipart-/Formulardatenformat hochzuladen. Ein paar Fallstricke genügen für einen Artikel.

Wichtige Warnung

Lesen Sie nicht die offizielle chinesische Dokumentation von PHP! Die Version kann nicht mithalten und wird dich umbringen!

Unterschiede in cURL zwischen verschiedenen PHP-Versionen

PHPs cURL unterstützt die Übergabe assoziativer Arrays (anstelle von Zeichenfolgen) an CURL_POSTFIELDS, um eine zu generieren POST-Anfrage für multipart/form-data.

Traditionell unterstützt cURL von PHP das Anhängen von Dateien mithilfe der Syntax „@+vollständiger Dateipfad“ in den Array-Daten, damit cURL sie lesen und hochladen kann. Dies steht im Einklang mit der Syntax für den direkten Aufruf des cURL-Programms über die Befehlszeile:

curl_setopt(ch, CURLOPT_POSTFIELDS, array(
  'file' => '@'.realpath('image.png'),
));
Nach dem Login kopieren

equals

$ curl -F "file=@/absolute/path/to/image.png" <url>
Nach dem Login kopieren

Aber PHP hat seit 5.5 eine neue CURLFile-Klasse eingeführt, um auf Dateien zu verweisen. Die CURLFile-Klasse kann außerdem im Detail zusätzliche Informationen wie MIME-Typen, Dateinamen usw. definieren, die in Multipart-/Formulardatendaten erscheinen können. PHP empfiehlt die Verwendung von CURLFile, um die alte @-Syntax zu ersetzen:

curl_setopt(ch, CURLOPT_POSTFIELDS, [
  &#39;file&#39; => new CURLFile(realpath(&#39;image.png&#39;)),
]);
Nach dem Login kopieren

PHP 5.5 führt außerdem die Option CURL_SAFE_UPLOAD ein, die das cURL-Modul von PHP zur Ablehnung zwingen kann Mit der alten @-Syntax werden nur Dateien im CURLFile-Stil akzeptiert. Der Standardwert ist „false“ für 5,5 und „true“ für 5,6.

Aber die Gefahr ist: Die @-Syntax ist in 5.5 veraltet und wurde in 5.6 direkt gelöscht (es wird eine ErorException generiert: Die Verwendung der @filename-API zum Hochladen von Dateien ist veraltet. Bitte verwenden Sie stattdessen die Klasse CURLFile).

Für PHP 5.6+ ist es sinnlos, CURL_SAFE_UPLOAD manuell auf „false“ zu setzen. Es wird nicht wörtlich so verstanden, dass „das Setzen auf „false“ die alte unsichere Methode aktiviert“ – die alte Methode existiert als veraltete Syntax überhaupt nicht mehr. PHP 5.6+ == Nur CURLFile, machen Sie sich keine Illusionen.

Meine Bereitstellungsumgebung ist 5.4 (nur @Syntax), aber meine Entwicklungsumgebung ist 5.6 (nur CURLFile). Keiner von beiden konzentriert sich auf 5.5, eine Übergangsversion, die beide unterstützen. Daher müssen zwei Codesätze mit Umweltbeurteilung geschrieben werden.

Jetzt kommt das Problem...

Umweltbeurteilung: Vorsicht vor der magischen Zahl!

Ich habe diese Art von Umweltbeurteilungscode gesehen:

if (version_compare(phpversion(), &#39;5.4.0&#39;) >= 0)
Nach dem Login kopieren

Ich habe nur einen Kommentar zu dieser Art von Codewort: Scheiße.

Dieses Urteil gerät in eine typische magische Zahlenfalle. Die Versionsnummer erscheint aus unerklärlichen Gründen im Code. Ohne langes Lesen des PHP-Handbuchs und des Update-Verlaufs ist es schwierig zu verstehen, an welcher Funktionsänderung der Autor festhält.

Der Code sollte zu seinen Wurzeln zurückkehren. Unsere eigentlichen Bedürfnisse sind tatsächlich: Verwenden Sie zuerst CURLFile, ohne auf die traditionelle @-Syntax zurückzugreifen. Dann kommt der Code:

if (class_exists(&#39;\CURLFile&#39;)) {
  $field = array(&#39;fieldname&#39; => new \CURLFile(realpath($filepath)));
} else {
  $field = array(&#39;fieldname&#39; => &#39;@&#39; . realpath($filepath));
}
Nach dem Login kopieren

Es wird empfohlen, die Degradationsoption explizit anzugeben

Aus zuverlässiger Sicht wird empfohlen, den Wert von CURL_SAFE_UPLOAD anzugeben, um PHP klar mitzuteilen, ob die alte @-Syntax toleriert oder verboten werden soll. Beachten Sie, dass die CURLOPT_SAFE_UPLOAD-Konstante selbst in niedrigeren PHP-Versionen möglicherweise nicht vorhanden ist. Sie müssen Folgendes beurteilen:

if (class_exists(&#39;\CURLFile&#39;)) {
  curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
} else {
  if (defined(&#39;CURLOPT_SAFE_UPLOAD&#39;)) {
    curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
  }
}
Nach dem Login kopieren

Die Reihenfolge von cURL-Optionseinstellungen

Ob curl_setopt() einzeln oder curl_setopt_array() stapelweise, die Optionen von cURL werden immer einzeln wirksam, und die eingestellten Optionen wirken sich sofort auf das Verhalten von cURL bei der Einstellung aus nachfolgende Optionen.

Zum Beispiel bezieht sich CURLOPT_SAFE_UPLOAD auf das Verhalten von CURLOPT_POSTFIELDS. Wenn CURLOPT_POSTFIELDS zuerst und dann CURLOPT_SAFE_UPLOAD festgelegt wird, wird die Einschränkung des letzteren nicht wirksam. Denn beim Festlegen des ersteren hat cURL das eigentliche Lesen und Verarbeiten der Daten bereits abgeschlossen!

CURL bietet mehrere Optionen, die diese Gefahr bergen. Seien Sie also vorsichtig. Glücklicherweise gibt es für diese Art von „Abhängigkeit“ nicht viele Optionen und der Mechanismus ist nicht kompliziert, sodass er einfach gehandhabt werden kann. Meine Methode besteht darin, zunächst alle Optionen stapelweise festzulegen und dann curl_exec()einzelne Einstellungencurl_setopt() bis kurz vor CURLOPT_POSTFIELDS zu verwenden.

Tatsächlich ist in dem von curl_setopt_array() verwendeten Array garantiert, dass die Position von CURLOPT_POSTFIELDS am Ende zuverlässig ist. Die assoziativen Arrays von PHP sind sequentiell garantiert. Wir können auch davon ausgehen, dass die interne Ausführungsreihenfolge von curl_setopt_array() vom Anfang bis zum Ende in Ordnung sein muss (naja, ich weiß, das ist keine gute Sache, aber einige der Fakten sind zu einfach. Lassen Sie mich das erklären. Dies ist eine Mindestbehauptung. Sie können also beruhigt sein.

Mein Ansatz besteht lediglich darin, die Codeleistung zusätzlich abzusichern und die Bedeutung der Ordnung hervorzuheben, um zukünftiges Betrügen zu verhindern.

Namespace

PHP-Versionen 5.2 oder niedriger haben keine Namespaces. Wenn im Code das Leerzeichen verwendet wird, tritt ein Parserfehler auf. Es ist eigentlich einfach, darüber nachzudenken, sich um PHP 5.2 zu kümmern, indem man einfach den Namespace aufgibt.

Was zu beachten ist, ist, dass PHP 5.3+ über Namespaces verfügt. Unabhängig davon, ob Sie CURLFile aufrufen oder class_exists() verwenden, um die Existenz von CURLFile zu ermitteln, wird empfohlen, CURLFile zu schreiben, um den Speicherplatz der obersten Ebene klar anzugeben und zu verhindern, dass der Code abstürzt, wenn er in den Namespace eingeschlossen wird.

Verwandte Empfehlungen:

Kompatibel mit der cURL-Datei-Upload-Funktion von PHP5 und PHP7

Das obige ist der detaillierte Inhalt vonPHP5.0~5.6 Kompatibilität verschiedener Versionen der Funktion zum Hochladen von cURL-Dateien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage