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).
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)
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.
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
Comment reconnaitre un fichier pdf
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli