ajouter photo à API, erreur 406

romane_pm
Invité n'ayant pas de compte PHPfrance

31 janv. 2020, 20:05

Bonjour à tous,

Je suis sur une projet où je dois coder une site internet en php. Ce site est "lié" à une API.

Le but du site est de créer des fiches de non conformité pour ensuite y avoir accès. Mon problème est lors de l'ajout de photos à une fiche.

Voici mon code:
//récupération du token pour avoir accès à la fonction de l'API
$token_file=fopen("headers.txt","r");
        $i=0;
        while($i<2)
        {
            $token=fgets($token_file);
            $i++;
        }
        fclose($token_file);
 
//récupération du chemin de la photo (c'est le bon chemin qui récupère la photo j'ai testé
        $pathCurrrent=getcwd ();
        $path= str_replace("public", "src/Controller", $pathCurrrent);
        $dir    = "$path/uploads";
        $allFiles = scandir($dir);
        $files=array_diff($allFiles, array('.','..'));
        print_r($files);
        $photo=$dir.'/'.$files[2];
        echo $photo;
 
        $curl = curl_init();
 
        curl_setopt_array($curl, array(
            CURLOPT_URL => "http://monURl/uploadFile?flashAttributes=%7B%7D&fnc_id=7&type=true",
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => array('file'=> new CURLFILE($photo)),
            CURLOPT_HTTPHEADER => array(
                rtrim($token, "\r\n"),
                'Accept: /',
                "Content-Type: multipart/form-data"
 
            ),
        ));
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
 
        $result = curl_exec($curl);
        var_dump($result);
        $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        var_dump($http_code);
        curl_close($curl);
Cependant cela me renvoie une erreur 406 je ne comprends pas pourquoi. Pourriez-vous m'aider ? Un grand merci !

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

31 janv. 2020, 20:53

Qu'est-ce qui renvoie une erreur 406 ?
Le résultat de ton appel Curl ? Si c'est le cas il faut que tu voies avec le serveur vers lequel tu fais cet appel car impossible pour nous sans le connaitre de savoir pourquoi il te répond cela.
Quand tout le reste a échoué, lisez le mode d'emploi...

romane_pm
Invité n'ayant pas de compte PHPfrance

02 févr. 2020, 12:54

finalement j'ai fais ça
   $token_file=fopen("headers.txt","r");
        $i=0;
        while($i<2)
        {
            $token=fgets($token_file);
            $i++;
        }
        fclose($token_file);


        $pathCurrrent=getcwd ();
        $path= str_replace("public", "src/Controller", $pathCurrrent);
      //  echo $path;
        $dir    = "$path/uploads";
        $allFiles = scandir($dir);
        $files=array_diff($allFiles, array('.','..'));
        print_r($files);
        $photo=$dir.'/'.$files[2];
      //  print_r($files[2]);
        echo $photo;

        $boundary = uniqid();
        echo $boundary;
        $delimiter = '-------------' . $boundary;

     /*   if (function_exists('curl_file_create')) { // php 5.5+
            $cFile = curl_file_create($photo);
        } else { //
            $cFile = '@' . realpath($photo);
        }
        $post = array('extra_info' => '123456','file'=> $cFile);*/


        $curl = curl_init();

        curl_setopt_array($curl, array(
            CURLOPT_URL => "http://varlot.epfprojets-sceaux.com:8080/uploadFile?flashAttributes=%7B%7D&fnc_id=7&type=true",
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => array('file'=> @$photo),
            CURLOPT_HTTPHEADER => array(
                rtrim($token, "\r\n"),
               // 'Accept: /',
                "Content-Type: multipart/form-data; boundary=" . $delimiter,

            ),
        ));
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);

      //  curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
        //$postfiles=array('file'=> new CURLFILE($photo));
       // print_r($postfiles);

        $result = curl_exec($curl);
        var_dump($result);
        $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        var_dump($http_code);
        curl_close($curl);
Et j'ai l'erreur 400 Required request part 'file' is not present. Mais je ne comprends pas car il y le champs 'file'. j'ai essayé de la faire en mettant new CURLFILE aussi mais j'ai eu la même erreur...

Eléphant du PHP | 63 Messages

02 févr. 2020, 18:13

Bonjour. Je connais mal cURL, par contre
 
                                       // Une image est toujours en base64.
CURLOPT_POSTFIELDS => array( 'file' => base64_encode($photo) ), // file est bien le nom du champs du formulaire?
                               // au vu de HTTP 406 Accept incorrect et HTTP 400 entête incorrecte
CURLOPT_HTTPHEADER => array(), // autant essayer d'abord avec aucune entête supplémentaire.