Pomocí knihovny cURL můžete programově vytvářet požadavky na server pomocí mnoha protokolů. Nás ale bude dnes zajímat pouze HTTP nebo HTTPS a konkrétně odeslání jednoho nebo více souborů.
Oprava 9.8.2017: Nemožnost použít @ pro upload souboru není záležitostí Windows, ale nekompatibilní změna mezi PHP 5.5 a 5.6, viz dokumentace.
cURL a POST se soubory
V následujícím kódu je ukázka, jak odeslat POST požadavek, který obsahuje soubory. Samozřejmě kromě souborů můžeme přidávat i další pole. Ukázka obsahuje odeslání cookies, ignorování nevalidních SSL certifikátů a ukládání celé komunikace do logu.
$post = array( 'jmeno' => "...", 'prijmeni' => "...", 'profilova_fotka' => new CURLFile("/home/pavel/fotka.jpg"), ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://example.com/createAccount.php"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cookie: nazev_cookie=hodnota; nazev_dalsi_cookie=hodnota")); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Lze vypnout kontrolu certifikátu, nebo odkazem níže nastavit PHP tak, // Aby kontrolu prováděl na základě známých certifikačních autorit curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Ukládá log požadavku, lze zakomentovat curl_setopt($ch, CURLOPT_VERBOSE, true); $verbose = fopen(dirname(__FILE__)."/log/curl.log", 'w+'); curl_setopt($ch, CURLOPT_STDERR, $verbose); // Provedeme požadavek a skončíme $result=curl_exec ($ch); fclose($verbose); curl_close ($ch);
Pro správné ověřování certifikačních autorit je nutné stáhnout do PHP balík CA a nastavit. Jak na to je popsáno v článku cURL chyba 60 - SSL certificate problem.
PHP 5.5 a níže
V PHP pod verzí 5.5 včetně, funguje postup se syntaxí @cesta_k_souboru a je také nutné vypnout SAFE_UPLOAD. Adresa k souboru musí být vždy absolutní a začínat znakem @. Následuje na Linuxu / nebo pod Windows C: apod.
// Vypnutí SAFE_UPLOAD curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); // Za @ musí být absolutní cesta $post = array( ... 'profilova_fotka' => "@/home/pavel/fotka.jpg", );
Za jakoukoli zpětnou vazbu budu rád, stačí pouze napsat komentář.
K tomuto článku již není možné přidávat další komentáře
Komentáře
Dobrý den,
sháním info užití cURL knihovny v aplikacích .Net.
Její použití a zasílání souborů (příkazů) do banky.
Nevím zda jste se s tímto setkal v prostředí .Net .
Děkuji za případné info.
BrLu
S cURL pro .NET žádné zkušenosti nemám. Můj odhad ale je, že tam budou jiné třídy a metody, protože cURL není nativně ve Windows, takže tam se to bude dělat nejspíše jinak.