J'ai un téléchargement cURL qui échoue après la mise à niveau de 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);
Le fichier semble vide sur le système cible.
En fait, j'ai trouvé la réponse en commençant la question. Il y a une nouvelle variable incluse avec curl dans PHP 5.5: CURLOPT_SAFE_UPLOAD
il est défini sur false
par défaut dans PHP 5.5 et est remplacé par une valeur par défaut de true
dans PHP 5.6.
Cela empêchera le modificateur de téléchargement "@" de fonctionner pour des raisons de sécurité - la saisie de l'utilisateur pourrait contenir des demandes de téléchargement malveillantes. Vous pouvez utiliser la classe CURLFile
pour télécharger des fichiers tout en CURLOPT_SAFE_UPLOAD
est défini sur true
ou (si vous êtes sûr que vos variables sont sûres, vous pouvez changer le CURLOPT_SAFE_UPLOAD
à false
manuellement):
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
Voici une source pour les informations qui m'ont poussé à chercher dans la bonne direction: http://comments.gmane.org/gmane.comp.php.devel/87521
Il est également mentionné dans les fonctions modifiées: http://php.net/manual/en/migration56.changed-functions.php Mais pas dans les changements incompatibles en arrière, m'a vraiment déclenché ...
Faites juste les changements suivants pour PHP 5.5 ou supérieur
Au lieu de "@" . $localFile
, Utilisez simplement new \CURLFile($localFile)
Et mettre
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
Inclure une vérification de l'exécution pour rendre votre code compatible avec les versions antérieures comme ci-dessous
$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);