Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment reconnaitre un fichier pdf

Sujet résolu
    16 décembre 2024 à 17:55:56

    Bonsoir, c'est encore moi...

    J'upload le cv de l'utilisateur en PATCH donc je ne peux pas utiliser la variable $_FILES et ses avantages pour avoir certaines informations(PHP: PUT method support - Manual).

    Le code: Code - Pastebin.com. La plateforme bloque quand je le mets ici.

    La variable $mime_type vaut à chaque fois application/octet-stream. Comment faire pour être sur que c'est un fichier PDF s'il vous plait ?

    • Partager sur Facebook
    • Partager sur Twitter
      16 décembre 2024 à 18:10:08

      Tu en lis les premiers octets qui doivent valoir %PDF-1. ?

      Soit :

      const PDF_HEADER = '%PDF-1.';
      
      $header = fread($putdata, strlen(PDF_HEADER)); # + 2 avec preg_match (pour le numéro de sous-version + le caractère \r ou \n)
      if (PDF_HEADER == $header) {
      # ou
      # \A = début de la chaîne
      # \R = \r et/ou \n (en réalité, on ne lit pas assez d'octets pour que cela puisse être \r\n)
      #if (preg_match('~\A%PDF-1\.[0-7]\R~', $header)) {
          rewind($putdata);
          // ce serait un PDF : le copier/écrire sur le disque avec ta boucle fread/fwrite
      } else {
          // ce n'est pas un PDF
      }
      fclose($putdata);
      

      ?

      (bien évidemment, ce n'est pas une garantie absolue pour autant)

      EDIT : corrigé, $putdata est un descripteur de fichier, pas une chaîne

      Du coup, tu pourrais d'abord "vérifier" que c'est un fichier PDF avant de l'écrire sur le disque plutôt que de d'abord écrire le fichier pour ensuite le vérifier (les finfo_*) et sinon le supprimer (unlink)

      -
      Edité par julp 17 décembre 2024 à 1:13:36

      • Partager sur Facebook
      • Partager sur Twitter
        17 décembre 2024 à 8:34:02

        Bonjour, fread($putData, strlen(PDF_HEADER) vaut "-----". J'ai essayé fread($putData, 100) après une requête Postman et c'est:

        ----------------------------054500756817770870961579
        Content-Disposition: form-data; name="resume";
        

        Apres une requête depuis l'application mobile:

        --dart-http-boundary-F8BcyASa9U52ibGuvSU_K9.fsCK9svq0d4HG+mI_dh+dLo3pFpb
        content-type: application/
        

        Edit fread($putData, 200): App mobile:

        --dart-http-boundary-RVS4A85KBZnSuKf4i_vQAEaYb_hJcqhPQqxE9U_vr4yH9-pVt2F
        content-type: application/pdf
        content-disposition: form-data; name="resume"; filename="transaction_receipt1715695070006.pdf"
        
        %PDF-1.4
        1 0 obj
        <<
        /Title (��)
        /Creator (��)
        /Producer (��
        

        Postman

        ----------------------------465480209226790526582808
        Content-Disposition: form-data; name="resume"; filename="T680555682.pdf"
        Content-Type: application/pdf
        
        %PDF-1.4
        %����
        1 0 obj
        <<
        /Creator (Upwork)
        /Producer (Upwork)
        /CreationDate (D:20240329113910Z)
        >>
        endobj
        

        Je remarque %PDF-1.4 sur chaque. Mais pas à la meme ligne.

        -
        Edité par Asmitta 17 décembre 2024 à 8:39:57

        • Partager sur Facebook
        • Partager sur Twitter
          17 décembre 2024 à 11:11:41

          erf, c'est parce que c'est une requête HTTP brute, il faut parser/ignorer les entêtes HTTP et récupérer le corps.

          Chercher le double saut de ligne (la ligne vide) séparant entêtes/corps dans un premier temps ?

          Une "solution" : faire un fread de, par exemple, 4 ko (au lieu de ces moins de 10 octets) et passer à preg_match en adaptant la regexp pour if (preg_match('~\R\R%PDF-1\.[0-7]\R~', $header)) { ?

          PS : au fait, le rewind, mais il ne doit rien consommer vu que php://input doit résider en mémoire, peut être remplacé par une écriture du fichier par une boucle do/while au while actuel.

          -
          Edité par julp 17 décembre 2024 à 11:22:08

          • Partager sur Facebook
          • Partager sur Twitter
            17 décembre 2024 à 11:28:46

            Ta solution de tout à l'heure marche bie. J'ai vu le souci:

            J'uploadais le fichier dans Postman en "form-data", j'ai changé pour le binaire. Dans le code aussi j'ai fait la modification et c'est bon. Je fais la vérification en back comme ceci:

                        $pdf_header = '%PDF-1.';
                        $put_data = fopen("xxxx", "r"); // L'envoi est bloqué quand je mets le vrai contenu
                        if (!$put_data) {
                            return new WP_REST_Response(['message' => 'No resume uploaded'], 400);
                        }
            
                        $header = fread($put_data, strlen($pdf_header));
                        if ($pdf_header != $header || $request->get_content_type()['value'] != 'application/pdf') {
                            return new WP_REST_Response(['message' => 'Invalid file type. Only PDF files are accepted'], 400);
                        }
            
                        // ...

            C'est bon.

            -
            Edité par Asmitta 17 décembre 2024 à 11:30:45

            • Partager sur Facebook
            • Partager sur Twitter

            Comment reconnaitre un fichier pdf

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown