You are not logged in.
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