7
votes

PHP - boucle à travers $ _files pour vérifier la filetype

Ma première question sur Donc, merci. :)

Je développe un système de journalisation d'un problème de soutien pour ma société et il doit permettre de télécharger des fichiers que tous les problèmes soumis à notre base de données. Il pourrait y avoir de 0 à 6 téléchargements différents pour vérifier, ainsi qu'un problème de support. J'ai réussi à obtenir une variable précise du nombre de fichiers dans le cadre d'un champ d'entrée caché (imgcount) qui met à jour via JS chaque fois qu'une image est sélectionnée via une entrée de type = "Fichier" ou supprimé du formulaire.

My [Type d'entrée = "Fichier"] Les noms sont image1, image2, etc. Comme je pensais que ce serait plus facile de cette façon de les boucler.

lorsque le formulaire est soumis le formulaire Le code suivant prend connaissance de voir s'il existe des fichiers et des chèques de type valide (GIF / JPEG / PNG), ils peuvent donc être téléchargés en toute sécurité. Je ne suis pas trop inquiet pour les virus que le système de soutien a une belle connexion sécurisée et nous faisons confiance à nos clients. xxx

mais cela ne semble pas être en boucle correctement, Tout le monde a obtenu des idées comment je peux l'obtenir de boucler et de retourner correctement?


0 commentaires

7 Réponses :


2
votes

Eh bien, votre logique booléenne est ambiguë et ne fait probablement pas ce que vous voulez. Cela fonctionnera probablement mieux:

    $file = $_FILES['image' . $i];
    $type = $file['type'];
    if(($type == 'image/gif' || $type == 'image/jpeg' || $type == 'image/png') && $file['size'] < 500000)


3 commentaires

Ce n'est pas "ambigu", ce n'est tout simplement pas ce que l'auteur a voulu. Les règles de préséance de l'opérateur résolvent toute ambiguïté dans cette expression.


Mes excuses; La façon dont j'utilisais "ambigu" était ambiguë.


Cela semble faire le travail parfaitement.



0
votes

Je pense que votre si conditionné est faux. Vous avez besoin de crochets autour du premier groupe de booléens qui sont, comme celui-ci: xxx

Ceci signifie correctement "si le fichier est une image de (gif ou jpeg ou png) et est moins que cette taille ".

La façon dont vous l'avez eu avant n'était probablement probablement la logique que vous avez désirée.


0 commentaires

5
votes

Ce n'est pas une réponse directe à votre question, mais vous pouvez passer des valeurs de formulaire à PHP en tant que tableau qui devrait être plus facile à boucle. in_array () est également utile pour vérifier qu'une valeur est dans une liste autorisée.

html: xxx

php: xxx


0 commentaires

9
votes

the && opérateur a un Precedence que || , donc plutôt que (a ou b ou c) et d comme vous le souhaitez, il est en fait a ou b ou (c et d)

vous pouvez utiliser des parenthèses Pour faire respecter l'évaluation que vous avez destinée.

Cependant, quelque chose comme celui-ci pourrait être plus propre et plus facile à maintenir / lire: xxx


1 commentaires

Merci Paul, très apprécié - je suis allé avec cela à la fin.



4
votes

Comme d'autres personnes ont mentionné, la façon dont vous avez regroupé votre conditionnement était fausse. Cependant, plutôt que de simplement ajouter des parenthèses, je vous suggère de séparer complètement les deux conditions; xxx

Avoir cette séparation rend le code plus lisible et suggère la hiérarchie de condition plus facilement, plus Permet à vos messages d'erreur d'être plus significatif. C'est une bonne pratique pour séparer les déclarations conditionnelles de différents types, de sorte que tous les messages d'erreur restent utiles. Si votre code a jeté une erreur telle qu'elle est, l'utilisateur n'a aucun moyen de savoir (sans avoir à FAFF sur eux-mêmes) si leur image était trop grosse ou du mauvais type.


0 commentaires

0
votes

Vous pouvez combiner tout le ["type"] == x || ['Tapez'] == y dans un seul appel à in_array ($ _ fichiers [...] ["Type"], $ autorisé)>

$ _ fichiers [..] ['Type'] contient des données envoyées par le client qui n'est ni vérifiée ni assainie par PHP. Si le type du fichier est de toute pertinence ne s'appuyant pas sur $ _files [..] ['Type'] ou le suffixe de $ _files [..] ['Nom']. Seuls le contenu réel compte. Si nécessaire, vous pouvez tester cela avec L'extension FileInfo ou mime_content_type () (qui est marqué comme obsolète en faveur de FileInfo)


0 commentaires

2
votes

Je ne pense pas que vous avez vraiment besoin d'une variable mise à jour via JavaScript. Vous pouvez utiliser PHP pour savoir combien de fichiers ont été téléchargés par Vérification du code d'erreur . Vous pouvez également gérer les téléchargements de fichiers en cochant également l'extension de fichier, car différents navigateurs peuvent souvent envoyer différents types de mime. Voici un exemple de ce dont je parle:

$accepted_files = array(
    'jpg',
    'png',
    'gif',
    'jpeg'
);

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    foreach($_FILES as $key => $upload) {
        if ($upload['error'] == 0) {
            $file_parts = explode ('.',$upload['name']);
            if (in_array($file_parts[sizeof($file_parts)-1], $accepted_files)) {
                // This type of file is a-ok
            }
            else {
                // Not an accepted file type
            }
        }
    }
}   


2 commentaires

J'aime cette méthode, merci pour le conseil. Je vais certainement utiliser cela sur un autre projet sur lequel je travaille.


+1 pour ne pas utiliser JavaScript inutile, une solution moins complexe est meilleure