为什么不';我的简单文件扩展名检查不起作用吗


Why doesn't my simple filename extension check work?

// What's my mime?
$_mime = 'text/plain';
if ($_file[strlen($_file)-1] == 'j') { $_mime = 'text/javascript'; }
else { $_mime = 'text/css'; }

我真的不明白为什么上面的不起作用,我的服务器会用两种输入类型来响应,要么是.min.js,要么是.man.css

它应该取最后一个字符,后退一步,应该是js

不管怎样,响应总是text/css。当然,严格的哑剧限制会破坏我的整个网站。

您偏离了一个,这是一个常见的错误。

假设您的文件名是script.js

长度是9,但由于数组中的计数从0开始,因此j是第7个字母,s是第8个字母。

string.js
^       ^
0       8

所以只做if ($_file[strlen($_file)-2] == 'j')

$file = 'script.js';
console.log('File name length:', $file.length);
console.log('First letter:', $file[0]);
console.log('Last letter:', $file[$file.length - 1]);
console.log('The letter you want:', $file[$file.length - 2]);

另外,我假设$_file是一个包含文件名的字符串。

无论如何,我希望您知道您不是在进行mime类型检查,而是在检查文件扩展名-这不会为您提供任何安全性,而且您无法确定文件的mime类型。您需要信任文件的来源因此,如果文件是由第三方上传到服务器的,请不要使用这种方式来确定mime类型。

看起来你只是在检查文件扩展名,在这种情况下,你可以尝试这样一个简单的函数来获取扩展名。

function filename($file){
    return substr($file,0,strrpos($file,'.'));
}
function extension($file){
    return strtolower(substr(strrchr($file,'.'),1));
}

注意,这个函数不是防弹的,但在一个简单的场景中,比如你的,它会起作用。