У меня есть загрузка cURL, которая завершается неудачно после обновления с 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);
В целевой системе файл кажется пустым.
На самом деле я нашел ответ во время начала вопроса. В PHP 5.5 включена новая переменная: CURLOPT_SAFE_UPLOAD
это установлено на false
по умолчанию в PHP 5.5 и переключается на значение по умолчанию true
в PHP 5.6.
Это предотвратит работу модификатора загрузки ‘@’ по соображениям безопасности — пользовательский ввод может содержать вредоносные запросы на загрузку. Вы можете использовать CURLFile
класс для загрузки файлов во время CURLOPT_SAFE_UPLOAD
установлен в true
или (если вы уверены, что ваши переменные в безопасности, вы можете переключить CURLOPT_SAFE_UPLOAD
в false
вручную):
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
Вот источник информации, которая заставила меня искать в правильном направлении: http://comments.gmane.org/gmane.comp.php.devel/87521
Это упоминается и в измененных функциях: http://php.net/manual/en/migration56.changed-functions.php
Но не в отсталых несовместимых изменениях, действительно сбил меня с толку …
Просто выполните следующие изменения для PHP 5.5 или выше
Вместо "@" . $localFile
просто используйте new \CURLFile($localFile)
И установить
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
Включите проверку времени выполнения, чтобы сделать ваш код совместимым с более низкими версиями, как показано ниже
$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);