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-Key: 7389813588

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

Printed on: June 18, 2024 at 13:06 o'clock

Member: hempel
Solution hempel Jun 13, 2024 updated at 16:57:51 (UTC)
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ß
Member: Bl0ckS1z3
Bl0ckS1z3 Jun 13, 2024 at 17:21:22 (UTC)
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!
Member: hempel
hempel Jun 13, 2024 at 19:06:42 (UTC)
Goto Top
👍👋.
Member: stefaan
stefaan Jun 14, 2024 at 05:56:08 (UTC)
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
Member: Bl0ckS1z3
Bl0ckS1z3 Jun 16, 2024 at 08:18:54 (UTC)
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