bl0cks1z3
Goto Top

PHP CURL PUT File - ich bin am verzweifeln

Hallo,

ich bastele gerade an einem PHP Script eine Datei an unser DMS per RESTFUL API zu senden.

Es ist mein erstes CURL-Projekt in PHP

Ich bin eigentlich schon fast am Ziel, aber am letzen Schritt, die Datei per PUT an das DMS zu übergeben verzweifele ich gerade.

Ich habe schon alles was man im Netz so finden kann durchgeackert und auch ausprobiert, aber das DMS lehnt meinen Aufruf bisher immer ab.

HTTP/2 400 cache-control: no-cache pragma: no-cache expires: -1 date: Thu, 13 Jun 2024 15:35:57 GMT content-length: 0 "
errorstring(0) ""

Hier ist der Aufruf per curl per Commandline der funktioniert :

curl -L -X PUT "https://sv016/AmagnoMe/api/v2/documents/7f8b0969-a156-4bec-2ef7-08dc8a744917/file" --header "Content-Type: multipart/form-data" --header "Amagno-File-Create-Date: 2024-06-13T07:00:00.023Z" --header "Amagno-File-Change-Date: 2024-06-13T07:00:00.023Z" --header "Authorization: Bearer <TOKEN>" --form " =@C:/wvs/Test.pdf" -v  

Natürlich ist die Variable <TOKEN> beim Aufruf der aktuell gültige Token und die documentid aus der Url auch die die ich mir vorher vom DMS geholt habe.

Könnte mir mal bitte jemand helfen, wie man diesen Aufruf in PHP verpackt?

Hier einer meiner vielen erfolglosen Versuche :

<?PHP
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $create_file_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');  

curl_setopt($ch, CURLOPT_HTTPHEADER, [
	'Accept: application/json', 	  
	'Authorization: Bearer '.$token,  
    'Content-Type: multipart/form-data',  
	'Amagno-File-Create-Date: 2024-06-13T07:00:00.023Z',  
	'Amagno-File-Change-Date: 2024-06-13T07:00:00.023Z'  
		]
	);
    
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_CAINFO, "test-amagno-org.pem");  


$postData = array(
    'Testfile' => '@./Test.pdf',  
);


curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);


$response = curl_exec($ch);

$info = curl_getinfo($ch);


echo "<br>";  
var_dump($response);

$err = curl_error($ch);

echo "<br>error";  

var_dump($err);
curl_close($ch);
?>

Content-ID: 7389813588

Url: https://administrator.de/contentid/7389813588

Ausgedruckt am: 21.11.2024 um 17:11 Uhr

13034433319
Lösung 13034433319 13.06.2024 aktualisiert um 18:57:51 Uhr
Goto Top
Das Einbinden von Files via @ wurde laut Doku per Default in curl deaktiviert (CURLOPT_SAFE_UPLOAD) und ist ab PHP 7 immer True.

CURLOPT_SAFE_UPLOAD	

Immer true, was die Unterstützung für das Präfix @ für das Hochladen von Dateien in CURLOPT_POSTFIELDS deaktiviert. Das bedeutet, dass Werte, die mit @ beginnen, sicher als Felder übergeben werden können. Für das Hochladen kann stattdessen CURLFile verwendet werden.
https://www.php.net/manual/de/function.curl-setopt.php

Nutze also curl_file_create dafür

Teste mal
<?PHP
$ch = curl_init();
$create_file_url = 'https://sv016/AmagnoMe/api/v2/documents/7f8b0969-a156-4bec-2ef7-08dc8a744917/file';  

curl_setopt($ch, CURLOPT_URL, $create_file_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');  
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

curl_setopt($ch, CURLOPT_HTTPHEADER, [
	'Accept: application/json', 	    
	'Authorization: Bearer '.$token,    
    'Content-Type: multipart/form-data',    
	'Amagno-File-Create-Date: 2024-06-13T07:00:00.023Z',    
	'Amagno-File-Change-Date: 2024-06-13T07:00:00.023Z'    
		]
	);
    
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_CAINFO, "test-amagno-org.pem");    

$cfile = curl_file_create('./test.pdf','application/pdf','test.pdf');  
$postdata = ['file' => $cfile];  
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);

$response = curl_exec($ch);

if(!curl_errno($ch)){
    print_r($response);
}else{
    echo "Error: " . curl_error($ch);  
}
curl_close($ch);
Gruß
Bl0ckS1z3
Bl0ckS1z3 13.06.2024 um 19:21:22 Uhr
Goto Top
Hey hempel,

Du bist ein Held.

HTTP/2 204 cache-control: no-cache pragma: no-cache expires: -1 date: Thu, 13 Jun 2024 17:08:27 GMT

Ich suche jetzt schon seit Montag nach dieser Lösung und Du machst es einfach so?

Chapeau!

Vielen Dank!
13034433319
13034433319 13.06.2024 um 21:06:42 Uhr
Goto Top
👍👋.
stefaan
stefaan 14.06.2024 um 07:56:08 Uhr
Goto Top
Guten Morgen!

Schau dir
https://github.com/guzzle/guzzle
als HTTP-Client an, spätestens wenn das Skript umfangreicher wird, wird das ganze übersichtlicher.

Stefan
Bl0ckS1z3
Bl0ckS1z3 16.06.2024 um 10:18:54 Uhr
Goto Top
Hallo stefaan,

Vielen Dank. Es handelt sich im Moment noch um eine Machbarkeits-Analyse. Deshalb war es ersteinmal wichtig zu wissen, ob wir die Schnittstelle bedienen können.

Wo dann die Reise hin geht ist noch offen. Ich schaue es mir auf jeden Fall mal an.

VG