检查上传的文件是以csv格式

我正在上传一个文件在PHP中,只想上传它,如果它是一个CSV文件。 我相信我的语法对于内容types是正确的。 当它是一个csv文件时,它总是会去else语句。 我在这里做错了什么?

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

如果我改变内容types,它只适用于那种格式而不是csv。

MIMEtypes可能不是text/csv某些系统可以读取/保存它们不同。 (例如,有时IE会发送.csv文件作为application/vnd.ms-excel ),所以你最好打赌是build立一个允许值的数组并testing它,然后find所有可能的值来testing。

 $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返回为文本/纯文本,你可以运行一个preg_match ,以确保它有足够的逗号是一个csv。

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

这是我目前如何validation我的CSV文件的MIMEtypes:

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

你不能总是依靠MIMEtypes..

根据: 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有各种MIMEtypes。

你可能最好的检查扩展,再次不是很可靠,但对于你的应用程序,它可能会罚款。

 $info = pathinfo($_FILES['uploadedfile']['tmp_name']); if($info['extension'] == 'csv'){ // Good to go } 

代码未经testing。

所以我今天遇到了这个

试图通过查看$_FILES['upload_file']['type']来validation上传的CSV文件的MIMEtypes,但对于不同浏览器上的某些用户(并不一定是所述用户之间的相同浏览器;例如,它工作正常我在FF但另一个用户它不工作在FF) $_FILES['upload_file']['type']作为“application / vnd.ms-excel”而不是预期的“文本/ 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. } } 

MIMEtypes选项不是validationCSV文件的最佳select。 我用这个代码在所有的浏览器中运行良好

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

由于您担心用户错误地上传其他文件,我build议您在<input>标签中使用accept=".csv" 。 当用户上传文件时,它只会在浏览器中显示csv文件。 如果你已经find了一些更好的解决scheme,请让我知道,因为我也试图做同样的条件,在相同的条件 – “值得信赖的用户,但试图避免错误”

简单地使用“接受”和“需要”,避免了太多典型和不必要的编码。