web-dev-qa-db-fra.com

Vérifier que le fichier téléchargé est au format csv

Je suis en train de télécharger un fichier en php et je veux seulement le télécharger s'il s'agit d'un fichier csv. Je crois que ma syntaxe est correcte pour le type de contenu. Il va toujours à la déclaration else lorsqu'il s'agit d'un fichier csv. Qu'est-ce que je fais mal ici?

if (($_FILES["file"]["type"] == "text/csv"))
{

}
else
{

}

Si je change le type de contenu, cela fonctionne pour ce format mais pas pour le format csv.

42
theking963

le type mime peut ne pas être text/csv, certains systèmes peuvent les lire/les enregistrer différemment. (Par exemple, parfois IE envoie des fichiers .csv sous la forme application/vnd.ms-Excel). Il est donc préférable de créer un tableau de valeurs autorisées et de tester ces valeurs, puis de rechercher toutes les valeurs possibles sur lesquelles effectuer des tests. 

$mimes = array('application/vnd.ms-Excel','text/plain','text/csv','text/tsv');
if(in_array($_FILES['file']['type'],$mimes)){
  // do something
} else {
  die("Sorry, mime type not allowed");
}

si vous le souhaitez, vous pouvez ajouter une vérification supplémentaire si mime est renvoyé sous la forme text/plain, vous pouvez exécuter un preg_match pour vous assurer qu'il contient suffisamment de virgules pour constituer un csv.

67
Alan Cole

Il existe de nombreux types MIME possibles pour les fichiers CSV, selon le système d'exploitation de l'utilisateur et la version du navigateur.

Voici comment je valide actuellement les types MIME de mes fichiers CSV:

$csv_mimetypes = array(
    'text/csv',
    'text/plain',
    'application/csv',
    'text/comma-separated-values',
    'application/Excel',
    'application/vnd.ms-Excel',
    'application/vnd.msexcel',
    'text/anytext',
    'application/octet-stream',
    'application/txt',
);

if (in_array($_FILES['upload']['type'], $csv_mimetypes)) {
    // possible CSV file
    // could also check for file content at this point
}
36
ukliviu

Vous ne pouvez pas toujours compter sur le type MIME.

Selon: http://filext.com/file-extension/CSV

text/comma-separated-values, text/csv, application/csv, application/Excel, application/vnd.ms-Excel, application/vnd.msexcel, text/anytext

Il existe différents types MIME pour CSV.

Votre meilleur moyen de vérifier l'extension, encore une fois, n'est pas très fiable, mais cela peut convenir à votre application.

$info = pathinfo($_FILES['uploadedfile']['tmp_name']);

if($info['extension'] == 'csv'){
 // Good to go
}

Code non testé.

8
Eddie

Alors je me suis heurté à cela aujourd'hui. 

A tenté de valider le type MIME d'un fichier CSV téléchargé en regardant $_FILES['upload_file']['type'], mais pour certains utilisateurs de différents navigateurs (et pas nécessairement les mêmes navigateurs entre lesdits utilisateurs; par exemple, cela fonctionnait bien pour moi en FF mais pas pour un autre travailler sur FF), le $_FILES['upload_file']['type'] apparaissait comme "application/vnd.ms-Excel" au lieu du "text/csv" ou du "text/plain" attendu. 

J'ai donc eu recours aux fonctions beaucoup plus fiables de finfo_ * (IMHO), par exemple:

$acceptable_mime_types = array('text/plain', 'text/csv', 'text/comma-separated-values');

if (!empty($_FILES) && array_key_exists('upload_file', $_FILES) && $_FILES['upload_file']['error'] == UPLOAD_ERR_OK) {
    $tmpf = $_FILES['upload_file']['tmp_name'];

    // Make sure $tmpf is kosher, then:

    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime_type = finfo_file($finfo, $tmpf);

    if (!in_array($mime_type, $acceptable_mime_types)) {
        // Unacceptable mime type.
    }
}
4
Garvin

Comme vous vous inquiétez de ce que l'utilisateur télécharge un autre fichier par erreur, je vous suggère d'utiliser accept=".csv" dans la balise <input>. Il ne montrera que les fichiers csv dans le navigateur lorsque l'utilisateur le téléchargera. Si vous avez trouvé une meilleure solution, merci de me le signaler car j'essaie également de faire de même et dans le même état: "utilisateurs de confiance mais essayant d'éviter les erreurs"

3
Bhavesh Garg

L'option de type MIME n'est pas la meilleure option pour la validation du fichier CSV. J'ai utilisé ce code cela a bien fonctionné dans tous les navigateurs

$type = explode(".",$_FILES['file']['name']);
if(strtolower(end($type)) == 'csv'){

}
else
{

}
3
Vaibhav Shahu

utilisation simple "accepter" et "obligatoire" dans et en évitant tant de codage typique et indésirable.

0
manish yadav