【问题标题】:Using php to check MIME type of file uploaded via form使用 php 检查通过表单上传的文件的 MIME 类型
【发布时间】:2014-08-02 14:08:53
【问题描述】:

好的,所以我正在创建一个网站,让用户可以将要扫描的 csv 文件上传到 mySQL 数据库中。因为我不想冒险让邪恶的人上传可能会弄乱我的数据库的奇怪文件,所以我猜测检查文件的 mime 类型是个好主意。从其他线程我了解到,正确执行此操作的唯一方法是使用 finfo()。但我不让它工作。我的 uploadfile.php 中的以下代码仅打印出临时文件名,后跟“hello”。

$filename = $_FILES["file"]["temp_name"];
echo $filename;

if (function_exists('finfo_open')&&$mode==0) {
$finfo = finfo_open(FILEINFO_MIME_TYPE); 
echo finfo_file($finfo,$filename);
finfo_close($finfo); 
echo "hello";
}

所以我知道文件已经正确上传,我知道函数存在,我知道整个if子句没有错误。那么为什么它不起作用呢? 我正在通过 MAMP 对此进行测试,并认为那里可能存在一些错误?虽然它有 PHP 版本 5.4.4。

我也尝试过不同的版本,例如:

$mimetype = finfo_file($finfo,$filename); 
echo $mimetype;

但是没有任何效果。它从不打印任何 mime 类型 :( 我能做些什么来解决这个问题?

【问题讨论】:

    标签: php file-upload mime-types mime


    【解决方案1】:

    如果找不到类型,finfo_file 可以并且将返回空字符串和 FALSE。

    mime 类型的问题在于,您也不能信任它们。

    我之前做过这个,并用 fgetcsv 解析文件。那里有任何错误,我丢弃了文件。这样您就可以确定它是有效的 csv。

    当您插入数据库时​​,请确保您进行了正确的转义或使用准备好的语句。

    【讨论】:

    • 哈利路亚!现在我在宇宙中不再感到如此孤独:) 根据您的建议,我创建了代码: $filename = $_FILES["file"]["tmp_name"]; $file = fopen($filename,"r"); print_r(fgetcsv($file)); fclose($文件);它打印文件的第一行。那么如果 fgetcsv 返回 false 那么我会停止该文件吗?
    • 如果它返回 FALSE,则该文件肯定有问题,您应该丢弃它。如果你得到一个有效的回应,你应该做一些进一步的检查。例如,如果它发现的字段太少或太多。如果每行具有相同数量的字段,以此类推。
    猜你喜欢
    • 1970-01-01
    • 2014-02-20
    • 2011-02-13
    • 2021-08-09
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多