上传的检查文件采用csv格式

时间:2011-07-11 18:00:33

标签: php syntax file-upload content-type

我正在上传php中的文件,如果它是csv文件,只想上传它。我相信我的语法适合内容类型。当它是csv文件时,它总是转到else语句。我在这里做错了什么?

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

}
else
{

}

如果我更改了内容类型,则该格式不适用于csv。

7 个答案:

答案 0 :(得分:70)

mime类型可能不是text/csv某些系统可以读取/保存它们不同。 (例如,有时IE会将.csv文件发送为application/vnd.ms-excel),因此您最好的办法是构建一个允许值数组并对其进行测试,然后找到要测试的所有可能值。

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

如果您希望可以添加进一步检查mime是否以text / plain格式返回,则可以运行preg_match以确保其中有足够的逗号作为csv。

答案 1 :(得分:36)

CSV文件有很多可能的MIME类型,具体取决于用户的操作系统和浏览器版本。

这就是我目前验证CSV文件的MIME类型的方式:

$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
}

答案 2 :(得分:8)

您不能总是依赖MIME类型..

根据: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

CSV有各种MIME类型。

您可能最好检查扩展,再次不太可靠,但对于您的应用程序,它可能没问题。

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

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

未经测试的代码。

答案 3 :(得分:4)

所以今天我遇到了这个。

尝试通过查看$_FILES['upload_file']['type']来验证上传的CSV文件的MIME类型,但是对于各种浏览器上的某些用户(并不一定是所述用户之间的相同浏览器;例如,它在FF中对我有效但是对于另一个用户,它在FF上不起作用)$_FILES['upload_file']['type']出现为“application / vnd.ms-excel”而不是预期的“text / csv”或“text / plain”。

所以我使用了(IMHO)更可靠的finfo_ *函数,如下所示:

$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 :(得分:3)

Mime类型选项不是验证CSV文件的最佳选项。我使用此代码在所有浏览器中都运行良好

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

}
else
{

}

答案 5 :(得分:3)

由于您担心用户误将其他文件上传,我建议您在accept=".csv"标记中使用<input>。当用户上传文件时,它将仅在浏览器中显示csv文件。如果你找到了一些更好的解决方案,那么请让我知道,因为我也在尝试做同样的条件 - “值得信赖的用户,但试图避免错误”

答案 6 :(得分:0)

简单使用“接受”和“必需”  并避免这么多典型和不需要的编码。