Bonjour à tous.

Je code un site internet en php et j'utilise CURL pour utiliser les fonctionnalités d'une API.

Je veux télécharger un fichier PDF avec le bon nom qui est mis grâce à l'API (lorsque l'on télécharge la fiche directement du swagger cela met le bon nom).


Voici ce que je fais pour télécharger le fichier:

 $curl = curl_init();
 
            curl_setopt_array($curl, array(
                CURLOPT_URL => "URL",
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 0,
                CURLOPT_FOLLOWLOCATION => true,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_HTTPHEADER => array(
                    rtrim($token, "\r\n")
                ),
            ));
 
            $response = curl_exec($curl);
 
            header('Cache-Control: public');
            header('Content-type: application/pdf');
            header('Content-Disposition: attachment');
 
            curl_close($curl);
            echo $response;


Cependant cela ne se télécharge pas avec le bon nom. Quelqu'un aurait une idée de comment je peux faire ?


Merci !
Modifié par romane_pm (01 Mar 2020 - 15:19)
Salut,

je ne sais pas trop comment tu peux récupérer le nom avec curl, mais ensuite ça sera dans ton dernier header que tu dois préciser le filename:
Content-Disposition: attachment; filename="MonPdf.pdf"
Salut,
Merci pour ta réponse, cependant je sais comment mettre un nom à la main pour le pdf, c'est justement pour récuperer le nom qui est mis avec l'API que j'ai des problèmes Smiley confused
Modérateur
Bonjour, alors c'est compliqué.

Si le nom de fichier est fourni dans le Content-Disposition, il faut:

Ajouter les headers dans les options:


  …
  CURLOPT_HEADER => true,
  …


puis séparer le header du body:


    $response = curl_exec($curl);
    $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
    $header = substr($response, 0, $header_size);
    $body = substr($response, $header_size);

Il ne reste plus qu'à rechercher le filename dans le $header avec une expression régulière et renvoyer le $body (au lieu de $response).

Si le nom de fichier est celui de l'URL, c'est plus simple:

$filename = basename('http://example.com/files/machin.pdf');


Si c'est l'un ou l'autre, il suffit de tester dans l'ordre.
Meilleure solution
Merci beaucoup pour cette réponse !
J'ai réussi grâce à la premier méthode !! Smiley biggrin
Modifié par romane_pm (02 Mar 2020 - 15:27)