Retournez à
Accueil /
Envoi de fichier en cURL avec PHP
0
Récemment pour un projet web, je devais envoyer un fichier, faire une opération d'upload vers une API RESTful.
Ce qui se devait être simple, c'est finalement montrer très récalcitrant.
Voici quelques astuces qui vous serons, je l’espère, très utile.
Le but du script est très simple : permettre l'envoi d'un fichier vers un CRM, par le biais d'un formulaire HTML pour attacher ce fichier en tant que pièce jointe à une fiche.
Mon exemple utilise les fonctions cURL de base de PHP, et même de PHP 5.5+.
Ci-dessous, le code de la requête cURL, avec $ch représentant ma variable content l'objet cURL.
Le content-type permet l'envoi de fichiers, avoir de télécharger un fichier depuis un lien (dans le cas de Zoho CRM).
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'content-type: multipart/form-data' ));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array( 'file' => $this->curlFile( $file ) ));
Et le code de la fonction curlFile :
function curlFile( array $file ) {
return new CURLFile( realpath( $file["tmp_name"] ), $file["type"], $file["name"] );
}
Ici, ma fonction est hyper basique, je passe simplement le tableau $_FILES de PHP en paramètre.
Et je crée un objet CURLFile qui se gérera de créer les boundary et autres enrobages pour l'envoi de fichier.
CURLFile a aussi comme alias curl_file_create.
Ça peut parait très simple, mais j'ai eu pas mal de souci à mettre ça en place.
N'oubliez pas le realpath qui permet d'aller chercher le chemin réel du fichier, j'ai eu pas mal de souci avec les chemins entre mon dev windows et ma prod linux.
N'oubliez pas le realpath qui permet d'aller chercher le chemin réel du fichier, j'ai eu pas mal de souci avec les chemins entre mon dev windows et ma prod linux.
Bien évidemment, la fonction montrée ici est très simplifiée, il ne faut pas hésiter à tester l'existence et la validité du fichier à envoyer, regarder si son type est correct, etc.
J'espère avoir dépanner certaines personnes.
D'autres exemples :
Version avant PHP 5.5 : http://code.iamkate.com/php/sending-files-using-curl/