You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2022-01-17 13:12:28

Billte
Member
Registered: 2021-12-01
Posts: 4

Pièce-jointe Ticket - Transfert avec base64_encode

Bonjour,

Je dois créer un pont entre un système externe et GLPI.

Tout fonctionne bien via l'API sauf pour l'ajout d'un document.

Ma fonction ci-dessous fonctionne bien lorsque j'ai "la main" sur le document en question :

function AddAttachmentToTicket($aJSON)
{
	
	$aParams = getParams();

	$sUserToken = $aParams['user_token'];
	$sAppToken = $aParams['app_token'];
	$sURLEnding = "/initSession?Content-Type=%20application/json&app_token=".$sAppToken ."&user_token=".$sUserToken;
	$sAPIURL = $aParams['auth_url'];

	$sURL = $sAPIURL.$sURLEnding;

	// First connexion to get a session token
	$handle = curl_init($sURL);
	curl_setopt($handle, CURLOPT_URL,$sURL);
	curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
	$sJSON = curl_exec($handle);
	curl_close ($handle);
	$oObj = json_decode($sJSON,true);
	$sSessionToken = $oObj['session_token'];
	
	//--------------------------------

	$sURL = $sAPIURL."/Document"; 
	
	$uploadManifest = Conversion($aJSON); 
	
	//Variables
	$name = $uploadManifest['input']['name'];
	$path = $uploadManifest['input']['path'];
	$type = $uploadManifest['input']['type'];
	$name_ext = $uploadManifest['input']['_filename'];
	//

	$uploadManifest = json_encode($uploadManifest);
	
	$handle = curl_init();//Idem
	curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
	
	curl_setopt($handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
	curl_setopt($handle, CURLINFO_HEADER_OUT, 1);

	curl_setopt_array($handle, array(
	 CURLOPT_URL => $sURL,
	 CURLOPT_POST => 1,
	 CURLOPT_HEADER => 1,
	 CURLOPT_HTTPHEADER => array(
	  'Content-Type: multipart/form-data',
	  'App-Token:'.$sAppToken,
	  'Session-Token:'.$sSessionToken
	 ),

	 CURLOPT_POSTFIELDS => array(
	  'uploadManifest' => $uploadManifest,
	  'filename[0]' => new CURLFile($path, $type, $name_ext)
	 ),
	));

	echo $result = curl_exec($handle);

	echo "erreur n° " . curl_errno($handle);
	$header_info = curl_getinfo($handle, CURLINFO_HEADER_OUT) . "/";
	print_r($header_info);
	if ($result === false) {
	 $result = curl_error($handle);
	 echo stripslashes($result);

	}
	curl_close($handle);
}

et ci-dessous le JSON :

{"input" :
	{
	"name":"Document ticket test",
	"_filename":"file.txt",
	"documentscategories_id":"4",
	"entities_id":"1",
	"items_id":"523",
        "itemtype":"Ticket",
	"path":"C:\\file.txt",
	"type":"txt"
    }
}

Le chemin path fonctionne dans mes tests en local.
Cependant, le système avec lequel je dois m'interfacer et qui utilisera cette fonction, fournira plutôt un contenu de fichier encapsulé en base64.
J'ai donc testé ceci avec un contenu de fichier variabilisé :

        $txt = 'test content';
	$txt_file = 'data://application/octet-stream;base64,' . base64_encode($path);
	$txt_curlfile = new \CURLFile($txt_file, $type, $name_ext);

et dans les options de Curl :

	curl_setopt_array($handle, array(
	 CURLOPT_URL => $sURL,
	 CURLOPT_POST => 1,
	 CURLOPT_HEADER => 1,
	 CURLOPT_POSTFIELDS => array(
	  'uploadManifest' => $sFieldsJSON,
	  'filename[0]' => $txt_curlfile
	 ),
	));

Mais j'obtiens cette erreur :
Fatal error: Uncaught Exception: Problem opening URL: https://xxxxxxxx/apirest.php/Document/, couldn't open file "data://application/octet-stream;base64,VGVzdCBkZSBjb250ZW51IGRlIGZpY2hpZXIgdW4gcGV1IHBsdXMgbG9uZw=="

Ma question est donc : comment transmettre le document via la méthode d'encodage base64.

Merci pour vos réponses !


GLPI 9.5.5 sur DEBIAN 10

Offline

Board footer

Powered by FluxBB