recherche

Maison  >  Questions et réponses  >  le corps du texte

Envoyer le fichier encodé en base64 et JSON via CURL en php

<p>J'essaie d'utiliser CURL pour envoyer un fichier à PANDADOCS via l'appel API Créer un document à partir d'un fichier : https://developers.pandadoc.com/reference/create-document-from-pdf. </p> <p>En plus d'envoyer le fichier, je dois également envoyer un objet de données contenant les destinataires, etc. dans le cadre d'une chaîne de données multipart/form en JSON. Je ne sais pas comment configurer correctement cet appel et je continue de recevoir divers messages d'erreur renvoyés par son API, tels que "Un champ nommé fichier existe" </p> <p>Voici ce que j'ai jusqu'à présent : </p> <pre class="brush:php;toolbar:false;">fonction publique createDocument() { $p = getmypid(); $m = "({$p}) : PandaDoc::créer un document : "; $postfields = tableau(); $postfields['name'] = $this->document->name; $postfields['file'] = $this->document->file //PDF encodé en base 64; $destinataires = tableau( tableau( 'e-mail' => 'a.mcdoogle@test.com', 'first_name' => 'André', 'nom_de_famille' => 'rôle' => 'utilisateur', 'signing_order' => ) ); $données = tableau(); $data['destinataires'] = $destinataires ; $propriétaire = tableau( "email" => "john@example.com" ); $data['propriétaire'] = $propriétaire ; $postfields['data'] = json_encode($data); $header = array("Autorisation : clé API {$this->api_key}", "Type de contenu : multipart/form-data", "accepter" => "application/json") ; $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_URL, $this->url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields); $res = curl_exec($ch); si ($res === faux) { $errno = curl_errno($ch); $erreur = curl_error($ch); error_log("{$m}erreur cURL : {$error} ({$errno})"); throw new Exception("{$m}erreur cURL : {$error} ({$errno})"); } $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close ($ch); error_log("{$m}Résultats de PandaDoc : {$res}"); $response = json_decode($res); retourner $réponse ; }</pré> <p>Quelqu’un peut-il me dire ce que je fais de mal ? </p>
P粉139351297P粉139351297453 Il y a quelques jours597

répondre à tous(1)je répondrai

  • P粉848442185

    P粉8484421852023-08-29 09:16:59

    C'est faux :

    $postfields['data'] =  json_encode($data);

    Je trouve leur documentation API dérangeante.

    Court tutoriel :
    Il s'agit d'un simple formulaire HTML multipart/form-data :
    Ci-dessous, je traduis ce formulaire en curl.

    <form action="<url>" method="post" enctype="multipart/form-data">
    
    <input type="text" name="name1" value="value1" >
    <input type="text" name="name2" value="value2" >
    <input type="text" name="name3" value="value3" >
    
    <button type="submit">submit</button>
    </form>

    Pour envoyer ceci en curl, vous devez mettre les données du formulaire dans des champs de publication.

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, '<url>');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLINFO_HEADER_OUT, true);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "-----------------------------3303153187906175792551542585\r\nContent-Disposition: form-data; name=\"name1\"\r\n\r\nvalue1\r\n-----------------------------3303153187906175792551542585\r\nContent-Disposition: form-data; name=\"name2\"\r\n\r\nvalue2\r\n-----------------------------3303153187906175792551542585\r\nContent-Disposition: form-data; name=\"name3\"\r\n\r\nvalue3\r\n-----------------------------3303153187906175792551542585--\r\n");
    
    $response = curl_exec($ch);

    Voici les en-têtes de requête :

    Content-Length: 408
    Content-Type: application/x-www-form-urlencoded
    Accept: */*
    Host: my_curl_test_site.com
    X-Https: 1

    Voici le texte de la demande :

    -----------------------------3303153187906175792551542585
    Content-Disposition: form-data; name="name1"
    
    value1
    -----------------------------3303153187906175792551542585
    Content-Disposition: form-data; name="name2"
    
    value2
    -----------------------------3303153187906175792551542585
    Content-Disposition: form-data; name="name3"
    
    value3
    -----------------------------3303153187906175792551542585

    J'encode le pdf en Base64 comme ceci :

    $pdf = base64_encode(file_get_contents('example.pdf'));

    Pour votre API PandaDoc


    Il s'agit du champ du document, veuillez noter $pdf ci-dessus.

    ------BoundaryXXXXXXXXX
    Content-Disposition: form-data; name="file"; filename="Sample PandaDoc PDF with Field Tags.pdf"
    Content-Type: application/pdf;
    
    $pdf
    ------BoundaryXXXXXXXXX

    Votre type de contenu devra peut-être être application/pdf;base64
    Leurs exemples utilisent des données binaires.

    Voici votre champ de données

    ------BoundaryXXXXXXXXX
    Content-Disposition: form-data; name="data"
    
    { 
       "name": "My minimal document",
       "url": "https://example.com/path/to/mydocument.pdf",
       "recipients": [
          {
           "email":"nobody@example.com"
          }
       ],
       "parse_form_fields": false
    }
    ------BoundaryXXXXXXXXX

    Source : https://developers.pandadoc.com/docs/upload-and-send-a-local-pdf

    répondre
    0
  • Annulerrépondre