web-dev-qa-db-fra.com

Les téléchargements de fichiers cURL ne fonctionnent plus après la mise à niveau de PHP 5.5 à 5.6

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.

26
bardiir

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é ...

40
bardiir

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);
29
Deepti Gehlot

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);
9
Simhachalam Gulla