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

the*_*963 44 php syntax content-type file-upload

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

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

}
else
{

}
Run Code Online (Sandbox Code Playgroud)

如果我更改内容类型,它适用于该格式而不是csv.

Ala*_*ole 71

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");
}
Run Code Online (Sandbox Code Playgroud)

如果你希望你可以添加进一步的检查,如果mime以text/plain的形式返回,你可以运行一个preg_match以确保它有足够的逗号作为csv.

  • 我必须在数组中添加"application/octet-stream"以验证我的csv文件(从GMail联系人导出) (8认同)
  • -1.这段代码错了.这取决于用户的浏览器认为是以.csv结尾的文件名的正确MIME类型.此外,如果用户将.jpeg重命名为以.csv结尾,则此代码仍将允许其有效.为了根据提问者的评论(即用户不小心选择错误的文件)进行快速健全检查,检查文件扩展名要简单得多.要查看CSV文件是否对您的应用程序有效,请尝试按照您的应用程序规则处理CSV文件; 如果失败,则无效. (6认同)
  • 你应该总是检查内容,当文件实际上是一个csv但是有一些奇怪的mime类型如application/x-msdownload时,这个方法很容易失败.CSV可以是application/x-msdownload,但XLS也可以,所以这很糟糕. (3认同)

ukl*_*viu 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
}
Run Code Online (Sandbox Code Playgroud)

  • -1.这段代码错了.这取决于用户的浏览器认为是以.csv结尾的文件名的正确MIME类型.此外,如果用户将.jpeg重命名为以.csv结尾,则此代码仍将允许其有效.要查看CSV文件是否对您的应用程序有效,请尝试按照您的应用程序规则处理CSV文件; 如果失败,则无效. (6认同)
  • `text/plain`也允许上传.txt文件 (3认同)

Edd*_*die 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
Run Code Online (Sandbox Code Playgroud)

CSV有各种MIME类型.

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

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

if($info['extension'] == 'csv'){
 // Good to go
}
Run Code Online (Sandbox Code Playgroud)

代码未经测试.

  • 我想你会再次查看`$ _FILES ['uploadedfile'] ['name']`与`tmp_name`,因为tmp_name是服务器上的临时文件名.至少在我的情况下,tmp_name不包含原始文件扩展名. (4认同)

小智 7

由于您担心用户错误地上传其他文件,我建议您使用accept=".csv"in<input>标签。当用户上传文件时,它只会在浏览器中显示 csv 文件。如果您找到了更好的解决方案,请告诉我,因为我也在尝试在相同的条件下做同样的事情 - “受信任的用户,但要避免错误”

  • 嗯..这确实有助于让用户选择正确的文件类型,但对确保文件是有效的 csv 文件没有任何帮助。 (2认同)

小智 5

所以我今天遇到了这个。

尝试通过查看验证上传的CSV文件的MIME类型$_FILES['upload_file']['type'],但对于使用各种浏览器的某些用户(不一定要在所述用户之间使用相同的浏览器;例如,它在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.
    }
}
Run Code Online (Sandbox Code Playgroud)