web-dev-qa-db-ger.com

Überprüfen Sie, ob die hochgeladene Datei im CSV-Format vorliegt

Ich lade eine Datei in PHP hoch und möchte sie nur hochladen, wenn es sich um eine CSV-Datei handelt. Ich glaube, meine Syntax stimmt mit dem Inhaltstyp überein. Es geht immer zu einer anderen Anweisung, wenn es eine CSV-Datei ist. Was mache ich hier falsch?

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

}
else
{

}

Wenn ich den Inhaltstyp ändere, funktioniert es für dieses Format einfach nicht csv.

42
theking963

der Mime-Typ ist möglicherweise nicht text/csv. Einige Systeme können sie unterschiedlich lesen/speichern. (manchmal sendet IE .csv-Dateien als application/vnd.ms-Excel). Sie sollten also am besten ein Array mit zulässigen Werten erstellen und mit diesem testen, um dann alle möglichen Werte zu finden, mit denen getestet werden kann. 

$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");
}

wenn Sie möchten, können Sie eine weitere Überprüfung vornehmen, ob MIME als Text/Plain zurückgegeben wird. Sie können einen preg_match ausführen, um sicherzustellen, dass er genügend Kommas enthält, um ein CSV zu sein.

67
Alan Cole

Je nach Betriebssystem und Browserversion des Benutzers gibt es viele mögliche MIME-Typen für CSV-Dateien.

So validiere ich derzeit die MIME-Typen meiner CSV-Dateien:

$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

Sie können sich nicht immer auf den MIME-Typ verlassen.

Gemäß: 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

Es gibt verschiedene MIME-Typen für CSV.

Ihre wahrscheinlich beste Erweiterung der Überprüfung ist wiederum nicht sehr zuverlässig, aber für Ihre Anwendung kann es in Ordnung sein.

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

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

Code nicht getestet.

8
Eddie

Also bin ich heute darauf gestoßen. 

Es wurde versucht, den MIME-Typ einer hochgeladenen CSV-Datei durch Überprüfen von $_FILES['upload_file']['type'] zu überprüfen, jedoch für bestimmte Benutzer in verschiedenen Browsern (und nicht unbedingt dieselben Browser zwischen den genannten Benutzern; beispielsweise hat es für mich in FF gut funktioniert, für einen anderen Benutzer jedoch nicht Arbeit an FF) der $_FILES['upload_file']['type'] erschien als "application/vnd.ms-Excel" anstelle des erwarteten "text/csv" oder "text/plain". 

Also habe ich auf die (IMHO) weitaus zuverlässigeren Funktionen von finfo_ * zurückgegriffen:

$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

Da Sie sich Sorgen machen, dass der Benutzer aus Versehen andere Dateien hochlädt, würde ich vorschlagen, dass Sie accept=".csv" im <input>-Tag verwenden. Es werden nur CSV-Dateien im Browser angezeigt, wenn der Benutzer die Datei hochlädt. Wenn Sie eine bessere Lösung gefunden haben, lass es mich wissen, da ich auch versuche, dasselbe zu tun, und zwar in der gleichen Bedingung - "vertrauenswürdige Benutzer, aber versuche, Fehler zu vermeiden"

3
Bhavesh Garg

Die Option "Mime-Typ" ist nicht die beste Option zum Überprüfen der CSV-Datei. Ich habe diesen Code verwendet, der in allen Browsern gut funktioniert hat

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

}
else
{

}
3
Vaibhav Shahu

verwenden Sie einfach "akzeptieren" und "erforderlich" in und so viele typische und unerwünschte Kodierungen vermeiden.

0
manish yadav