2014-09-19 4 views
24

Ich habe einen cURL Upload bekommt, die von PHP 5,5-5,6 nach der Aktualisierung fehlschlägt:cURL Datei-Uploads nicht mehr funktioniert nach dem Upgrade von PHP 5,5-5,6

$aPost = array(
    'file' => "@".$localFile, 
    'default_file' => 'html_version.html', 
    'expiration' => (2*31*24*60*60) 
) 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $apiurl); 
curl_setopt($ch, CURLOPT_TIMEOUT, 120); 
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $aPost); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$sResponse = curl_exec ($ch); 

Die Datei auf dem Zielsystem leer zu sein scheint .

+0

Wie haben Sie ein Upgrade durchgeführt? War das Curl-Modul im Update enthalten? Welches OS ist das? Haben Sie andere Ursachen für das Problem beseitigt? – symcbean

+0

Ja, Curl funktioniert - Dateien sind leer (die Zeichenfolge wird aber an das Zielsystem anstatt an die Datei gesendet). OS ist CentOS, das zwischen den Updates nicht geändert hat. – bardiir

+0

(füge meinen Kommentar hinzu, da Sie Ihre Antwort hinzugefügt haben) – symcbean

Antwort

39

Eigentlich fand ich die Antwort beim Starten der Frage. Es gibt eine neue Variable, die mit curl in PHP 5.5 enthalten ist: CURLOPT_SAFE_UPLOAD Diese ist in PHP 5.5 standardmäßig auf false eingestellt und wird in PHP 5.6 auf den Standardwert true gesetzt.

Dadurch wird verhindert, dass der Upload-Modifier '@' aus Sicherheitsgründen funktioniert - Benutzereingaben können schädliche Upload-Anforderungen enthalten. Sie können die CURLFile Klasse verwenden, um Dateien zu laden, während CURLOPT_SAFE_UPLOAD auf true gesetzt ist oder (wenn Sie Ihre Variablen sind sicher sind, dass Sie die CURLOPT_SAFE_UPLOAD-false manuell umschalten):

curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); 

Hier ist eine Quelle für die Informationen, die habe ich in der richtigen Richtung suchen: http://comments.gmane.org/gmane.comp.php.devel/87521

Es ist in den geändertenen Funktionen auch erwähnt wird: http://php.net/manual/en/migration56.changed-functions.php Aber nicht in den rückständigen inkompatible Änderungen, ausgelöst mich wirklich weg ...

+4

Beachten Sie, dass die Einstellung von CURLOPT_SAFE_UPLOAD auf false eine abfällige Nachricht in PHP 5.5 oder höher ausgibt. Anstelle von "@". $ localFile 'benutze einfach' new \ CURLFile ($ localFile) '. Es ist nicht viel schwieriger. Natürlich ist diese Klasse in PHP 5.4 nicht verfügbar. –

+0

Es sieht so aus, als ob in PHP 5.6 nur das Setzen von 'CURLOPT_SAFE_UPLOAD' auf' false 'nicht funktioniert. Der richtige und einzige Weg, um es zum Laufen zu bringen, ist die von @ deepti-gehlot vorgeschlagene Methode –

22

Just do folgende Änderungen für PHP 5.5 oder höher

Statt "@" . $localFile nur new \CURLFile($localFile)

verwenden und

curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); 
+0

Du hast meinen Tag gerettet! –

8

Fügen Sie eine Laufzeitprüfung Code kompatibel zu mit niedrigeren Versionen machen wie unter

$aPost = array(
    'default_file' => 'html_version.html', 
    'expiration' => (2*31*24*60*60) 
) 
if ((version_compare(PHP_VERSION, '5.5') >= 0)) { 
    $aPost['file'] = new CURLFile($localFile); 
    curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); 
} else { 
    $aPost['file'] = "@".$localFile; 
} 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $apiurl); 
curl_setopt($ch, CURLOPT_TIMEOUT, 120); 
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $aPost); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$sResponse = curl_exec ($ch); 
+0

Die Variable $ post_array scheint schlecht benannt zu sein, sollte es nicht $ aPost sein? – giorgiosironi

+0

Sorry, habe vergessen, die Variable umzubenennen .. Vielen Dank. :) –

Verwandte Themen