Base64-codierte Datei und JSON über CURL in PHP senden
P粉139351297
P粉139351297 2023-08-28 10:22:44
0
1
640
<p>Ich versuche, CURL zu verwenden, um eine Datei über den API-Aufruf „Dokument aus Datei erstellen“ an PANDADOCS zu senden: https://developers.pandadoc.com/reference/create-document-from-pdf. </p> <p>Zusätzlich zum Senden der Datei muss ich auch ein Datenobjekt senden, das die Empfänger usw. als Teil einer mehrteiligen/Formulardatenzeichenfolge in JSON enthält. Ich bin mir nicht sicher, wie ich diesen Aufruf richtig einrichten soll, und erhalte ständig verschiedene Fehlermeldungen von der API zurückgegeben, z. B. „Ein Feld mit dem Namen „Datei existiert““</p> <p>Das habe ich bisher: </p> <pre class="brush:php;toolbar:false;">public function createDocument() { $p = getmypid(); $m = "({$p}): PandaDoc::create document: "; $postfields = array(); $postfields['name'] = $this->document->name; $postfields['file'] = $this->document->file; //base 64 kodiertes PDF $recipients = array( Array( 'email' => 'a.mcdoogle@test.com', 'Vorname' => 'Andrew', 'last_name' => 'role' => 'user', 'signing_order' => ) ); $data = array(); $data['recipients'] = $recipients; $owner = array( "email" ="john@example.com" ); $data['owner'] = $owner; $postfields['data'] = json_encode($data); $header = array("Autorisierung: API-Key {$this->api_key}", "Content-Type: multipart/form-data", "accept" => "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); if ($res === false) { $errno = curl_errno($ch); $error = curl_error($ch); error_log("{$m}cURL-Fehler: {$error} ({$errno})"); throw new Exception("{$m}cURL error: {$error} ({$errno})"); } $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close ($ch); error_log("{$m}Ergebnisse von PandaDoc: {$res}"); $response = json_decode($res); return $response; }</pre> <p>Kann mir jemand sagen, was ich falsch mache? </p>
P粉139351297
P粉139351297

Antworte allen(1)
P粉848442185

这是错误的:

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

我发现他们的 API 文档令人不安。

简短教程:
这是一个简单的 multipart/form-data HTML 表单:
下面我把这个形式翻译成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>

要在curl中发送此内容,您必须将表单数据放入postfields中。

$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);

这是请求标头:

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

这是请求正文:

-----------------------------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

我对 pdf 进行 Base64 编码,如下所示:

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

对于您的 PandaDoc API


这是文档字段,请注意上面的 $pdf。

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

$pdf
------BoundaryXXXXXXXXX

您的内容类型可能需要为application/pdf;base64
他们的示例使用二进制数据。

这是您的数据字段

------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

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

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage