web-dev-qa-db-fra.com

Convertir la ligne de commande cURL en PHP cURL

Je n'ai jamais fait de boucle auparavant, j'ai donc besoin d'aide. J'ai essayé de résoudre ce problème à partir d'exemples, mais je n'arrive pas à comprendre!

J'ai une commande curl que je peux exécuter avec succès à partir d'une ligne de commande linux (ubuntu) qui place un fichier sur un wiki via une api.

J'aurais besoin d'incorporer cette commande curl dans un script PHP que je construis.

Comment traduire cette commande curl pour qu'elle fonctionne dans un script PHP?

curl -b cookie.txt -X PUT \
     --data-binary "@test.png" \
     -H "Content-Type: image/png" \    
     "http://hostname/@api/deki/pages/=TestPage/files/=test.png" \
     -0

cookie.txt contient l'authentification, mais je n'ai aucun problème à le mettre en texte clair dans le script car il sera exécuté par moi uniquement.

@ test.png doit être une variable telle que $ filename

http: // hostname/@ api/deki/pages/= TestPage/files/= doit être une variable telle que $ pageurl

Merci pour toute aide.

32
Brigante

un point de départ:

<?php

$pageurl = "http://hostname/@api/deki/pages/=TestPage/files/=";
$filename = "test.png";

$theurl = $pageurl . $filename;

$ch = curl_init($theurl);
curl_setopt($ch, CURLOPT_COOKIE, ...); // -b
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); // -X
curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: image/png']); // -H
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); // -0

...
?>

Voir aussi: http://www.php.net/manual/en/function.curl-setopt.php

28
miku

Vous avez besoin ...

curl-to-PHP: https://incarnate.github.io/curl-to-php/

"Convertissez instantanément les commandes curl en PHP"

12
kris

Quel que soit le cURL que vous avez en ligne de commande, vous pouvez le convertir en PHP avec cet outil:

https://incarnate.github.io/curl-to-php/

Cela m'a aidé après de longues heures de recherche d'une solution! J'espère que cela vous aidera aussi! Votre solution est la suivante:

// Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://hostname/@api/deki/pages/=TestPage/files/=test.png");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$post = array(
    "file" => "@" .realpath("test.png")
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");


$headers = array();
$headers[] = "Content-Type: image/png";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
6

Essaye ça:

$cmd='curl -b cookie.txt -X PUT \
     --data-binary "@test.png" \
     -H "Content-Type: image/png" \    
     "http://hostname/@api/deki/pages/=TestPage/files/=test.png" \
     -0';
exec($cmd,$result);
5
manny

l'option --libcurl a été ajoutée à cet effet, même si elle fait un programme C, je pense qu'il devrait être assez facile à traduire en PHP

2
Daniel Stenberg

En utilisant la réponse de MYYN comme point de départ et cette page comme référence sur la façon d'envoyer POST données en utilisant PHP cURL, ici est ma suggestion (je travaille sur quelque chose de très similaire en ce moment):

<?php

$pageurl = "http://hostname/@api/deki/pages/=TestPage/files/=";
$filename = "test.png";

$theurl = $pageurl.$filename;

$ch = curl_init($theurl);
curl_setopt($ch, CURLOPT_COOKIE, ...); // -b
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); // -X
curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: image/png']); // -H
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); // -0

$post = array("$filename"=>"@$filename");
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
$response = curl_exec($ch);
?>

Vous pouvez probablement optimiser les nombreux curl_setopts avec l'utilisation d'un appel à curl_setopt_array () si vous le souhaitez.

2
r00fus

Malheureusement SO n'a toujours pas de balisage de table CommonMark. Il s'agit d'une liste autogénérée dont options de ligne de commande curl peut correspondre à quelle constante php CURLOPT_:

Notez que cela ne répertorie que les correspondances quelque peu exactes des options --long aux constantes CURLOPT_ de même nom. Mais cela devrait vous donner suffisamment d'indices sur la façon de comparer les curl --help sortie et la liste PHP curl_setopt ().

1
mario

Mieux ça. En une seule ligne.

$cmd='curl -b cookie.txt -X PUT --data-binary "@test.png" -H "Content-Type: image/png" "http://hostname/@api/deki/pages/=TestPage/files/=test.png" -0';
exec($cmd,$result);
1
Toxicity