przesyłanie pliku cURL nie działa już po aktualizacji z PHP 5.5 do 5.6

Mam curl upload, który nie powiedzie się po aktualizacji z PHP 5.5 do 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);

Plik wydaje się być pusty w docelowym systemie.

Author: bardiir, 2014-09-19

3 answers

Właściwie znalazłem odpowiedź podczas rozpoczynania pytania. W PHP 5.5 pojawiła się nowa zmienna curl: CURLOPT_SAFE_UPLOAD jest ona domyślnie ustawiona na false w PHP 5.5 i jest przełączana na domyślną wartość true w PHP 5.6.

Uniemożliwi to działanie modyfikatora ' @ ' ze względów bezpieczeństwa - Dane wejściowe użytkownika mogą zawierać złośliwe żądania przesyłania. Możesz użyć klasy CURLFile do przesyłania plików, gdy CURLOPT_SAFE_UPLOAD jest ustawiona na true lub (jeśli jesteś pewien, że Twoje zmienne są bezpieczne, możesz zmienić CURLOPT_SAFE_UPLOAD do false ręcznie):

 curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);

Oto źródło informacji, które skłoniły mnie do poszukiwania we właściwym kierunku: http://comments.gmane.org/gmane.comp.php.devel/87521

Jest też wspomniane w zmienionych funkcjach: http://php.net/manual/en/migration56.changed-functions.php Ale nie w wstecznych niezgodnych zmianach, naprawdę mnie zaskoczyło...

 41
Author: bardiir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-19 12:43:23

Po prostu wykonaj następujące zmiany dla PHP 5.5 lub nowszego

Zamiast "@" . $localFile Wystarczy użyć new CurlFile($localFile)

I zestaw

curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
 30
Author: Deepti Gehlot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-09 08:22:34

Dołącz test runtime, aby Kod był zgodny z niższymi wersjami, jak poniżej

$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);
 9
Author: Simhachalam Gulla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-20 08:48:38