Le fichier de contrôle téléchargé est au format csv
je télécharge un fichier en php et je ne veux le télécharger que s'il s'agit d'un fichier csv. Je crois que ma syntaxe est bonne pour le type de contenu. Ça va toujours à la déclaration else quand c'est un fichier csv. Ce que je fais de mal ici?
if (($_FILES["file"]["type"] == "text/csv"))
{
}
else
{
}
si je change le type de contenu il fonctionne pour ce format tout simplement pas csv.
7 réponses
le type mime pourrait ne pas être text/csv
certains systèmes peuvent lire/enregistrer différents. (par exemple parfois IE envoie .fichiers csv comme application/vnd.ms-excel
) pour vous meilleur pari serait de construire un tableau de valeurs autorisées et tester, puis de trouver toutes les valeurs possibles à tester.
$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 autre vérification si mime est retourné sous la forme text / plain vous pouvez lancer un preg_match
pour s'assurer qu'il y a assez de virgules pour être un csv.
Il y a beaucoup de types MIME possibles pour les fichiers CSV, en fonction du système D'exploitation de l'utilisateur et de 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
}
vous ne pouvez pas toujours compter sur le type MIME..
http://filext.com/file-extension/CSVtext/comma-separated-values, text/csv, application/csv, application/excel, application/vnd.ms-excel, application/vnd.msexcel, text/anytext
votre probablement meilleur de vérifier l'extension, encore une fois pas très fiable, mais pour votre application, il peut être très bien.
$info = pathinfo($_FILES['uploadedfile']['tmp_name']);
if($info['extension'] == 'csv'){
// Good to go
}
Code non testé.
alors j'ai rencontré ça aujourd'hui.
tentait de valider le type MIME d'un fichier CSV téléchargé en regardant $_FILES['upload_file']['type']
, mais pour certains utilisateurs sur différents navigateurs (et pas nécessairement les mêmes navigateurs entre ces utilisateurs; par exemple, il a fonctionné très bien pour moi EN FF mais pour un autre utilisateur, il n'a pas fonctionné sur FF) le $_FILES['upload_file']['type']
a venir "application/vnd.ms-excel" à la place de l' "text/csv" ou "text/plain".
alors j'ai utilisé le (IMHO) beaucoup plus les fonctions fiables de finfo_* quelque chose comme ceci:
$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.
}
}
l'option de type Mime n'est pas la meilleure option pour valider le 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
{
}
comme vous êtes inquiet au sujet de l'utilisateur de télécharger d'autres fichiers par erreur, je vous suggérerais d'utiliser accept=".csv"
<input>
balise. Il affiche uniquement les fichiers csv dans le navigateur lorsque l'utilisateur télécharge le fichier. Si vous avez trouvé une meilleure solution alors s'il vous plaît faites - le moi savoir que je suis également essayer de faire la même chose et dans la même condition - 'utilisateurs de confiance, mais en essayant d'éviter l'erreur'
utilisation simple "accept" et" required " dans et en évitant autant de codage typique et indésirable.