2012-06-26 129 views
0

我目前正在为一个网站构建一个文件上传器,我有一个文件类型问题,我需要它能够上传html,css,javascript,json文件,但不是PHP等。我的问题是我似乎无法找出文件类型的名称。请参阅下面的更多细节。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

尝试在IF处添加更多与$ _FILES ['file'] ['type']的比较,例如text/html – Gntem

+0

请注意,filetype/mimetype可能被欺骗,并不可靠 – Ikke

+0

@ jayhassett89:您为什么想要防止PHP文件?是否因为安全?因为如果是这样的话,上传HTML(或者在这种情况下甚至是某些浏览器的JPG等)可能会导致XSS攻击。 – SuperSaiyan

回答

3

如果你指的是:

echo "Type: " . $_FILES["file"]["type"] . "<br />"; 

这是MIME类型。如果你想看看文件扩展名,你必须解析文件名。 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

'$ _FILES [“file”] [“type”]'可以被欺骗! –

+0

@SalmanA:我正要说! :) – SuperSaiyan

+0

谢谢,文件扩展名可能是一个更好的主意反正安全明智,对不起,如果我的问题不清楚:) – jayhassett89

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 
} 

这是一个改变与多个基础,原油例如,如果/ elseif的语句,你可以做一个开关状态,使工厂类,等等...但这个想法保持不变。

干杯。

+2

如果像这样的树一般不是好的做法。您应该使用开关/外壳。 –

+0

同意,我注意到这只是一个“顶部的例子”,它应该在代码示例下以不同的方式完成。 :) – Nemanja