我目前正在构建一个网站即时建设的文件上传器,我有文件类型的问题,我需要它能够上传html,css,javascript,json文件,但不能PHP等。我的问题是我似乎无法找出文件类型名称。请参阅下文了解更多详情。
<?php
if (($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>
它有图像/ jpeg,我已经尝试过.html和html无效,以及.js等,我只是想不出来!救命!!! :d
答案 0 :(得分:3)
如果您指的是:
echo "Type: " . $_FILES["file"]["type"] . "<br />";
这是哑剧类型。如果要查看文件扩展名,则必须解析文件名本身。 E.G:
$ext = substr(strrchr($_FILES["file"]["name"], '.'), 1);
允许/禁止,使用开关是个好主意:
switch ($_FILES["file"]["type"]) {
case 'image/jpeg':
case 'image/gif':
// Allowed
break;
default:
// Not allowed
break;
}
switch ($ext) {
case 'jpeg':
case 'gif':
case 'jpg':
// Allowed
break;
default:
// Not allowed
break;
}
答案 1 :(得分:0)
我可以建议采用不同的方法吗?
不要依赖文件类型,而是检查扩展名。
这方面的一个例子是:
$parts = array();
$parts = explode( ".", $_FILES['file']['name'] );
if ( !empty($parts) && is_array($parts) ) {
$extension = end( $parts );
} else {
echo "File name has no extension";
}
if ( $extension == "jpg" || $extension == "jpeg" ) {
// Do something with the jpeg
} elseif ( $extension == "html" ) {
// Do something with html
} elseif ( $extension == "js" ) {
// Do something with js
} else if ( ... /* You can add any conditional based on extension here */ ) {
// And do whatever you want here
}
这是一个多变的基本粗略示例,包含多个if / elseif语句,您可以创建切换条件,创建工厂类等等......但这个想法保持不变。
干杯。
答案 2 :(得分:0)
依靠$_FILES
中的客户端文件类型并不安全,最好从文件内容中获取它。
function mime_type($file_path)
{
if (function_exists('finfo_open')) {
$finfo = new finfo(FILEINFO_MIME_TYPE, null);
$mime_type = $finfo->file($file_path);
}
if (!$mime_type && function_exists('passthru') && function_exists('escapeshellarg')) {
ob_start();
passthru(sprintf('file -b --mime %s 2>/dev/null', escapeshellarg($file_path)), $return);
if ($return > 0) {
ob_end_clean();
$mime_type = null;
}
$type = trim(ob_get_clean());
if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\.]+)#i', $type, $match)) {
$mime_type = null;
}
$mime_type = $match[1];
}
return $mime_type;
}