PHP:从:filename.jpg检测文件扩展名

PHP:从:filename.jpg检测文件扩展名,php,Php,是的,正如标题所说: 如何检测文件扩展名$_POST['fname'];是存储文件名的位置,例如asddsa.jpg 那么我如何检查.jpg是否。。。如果.png那么 $src = "images/status/photo/".$_POST['fname']; $parts=pathinfo($src); if($parts['extension'] == "jpg"){ $img_r = imagecreatefromjpeg($src); }elseif($parts

是的,正如标题所说:

如何检测文件扩展名$_POST['fname'];是存储文件名的位置,例如asddsa.jpg

那么我如何检查.jpg是否。。。如果.png那么

    $src = "images/status/photo/".$_POST['fname'];
    $parts=pathinfo($src);
if($parts['extension'] == "jpg"){
    $img_r = imagecreatefromjpeg($src);
}elseif($parts['extension'] == "png"){
    $img_r = imagecreatefrompng($src);
}elseif($parts['extension'] == "gif"){
    $img_r = imagecreatefromgif($src);
}
我也试过了,但没有成功:

    $ext= pathinfo($src, PATHINFO_EXTENSION);
if($ext == "jpg"){
    $img_r = imagecreatefromjpeg($src);
}elseif($ext == "png"){
    $img_r = imagecreatefrompng($src);
}elseif($ext == "gif"){
    $img_r = imagecreatefromgif($src);
}

您可以这样做:

$aPieces = explode( '.', $_POST[ 'fname' ] ); // A file name can have more than 1 .something

switch( strtolower( $aPieces[ count( $aPieces) - 1 ] ) ) // We take the LAST piece in our array
{
   case 'jpg':

   break;
   case 'png':

   break;
}

您可以这样做:

$aPieces = explode( '.', $_POST[ 'fname' ] ); // A file name can have more than 1 .something

switch( strtolower( $aPieces[ count( $aPieces) - 1 ] ) ) // We take the LAST piece in our array
{
   case 'jpg':

   break;
   case 'png':

   break;
}

解决方案实际上取决于您试图做什么,但是简单的方法是:

if ( strtolower(substr($_POST['fname'],-3)) == 'jpg' )
您还可以根据要进行的比较数量,打开字符串而不是使用if/else


编辑:如果您打算专门处理图像,最好使用

解决方案实际上取决于您要做什么,但是简单的方法可能是:

if ( strtolower(substr($_POST['fname'],-3)) == 'jpg' )
您还可以根据要进行的比较数量,打开字符串而不是使用if/else


编辑:如果您打算专门处理图像,最好使用

正确的方法是在文件上使用。例如

$parts=pathinfo('somefile.jpg');
echo $parts['extension']; //Returns "jpg"
现在,您只需查看变量中的字符串,因此处理此问题的方法是

最后,您不应该按扩展名检测文件类型。这很糟糕。相反,您应该使用通常称为MIME类型的内容类型。对于上载的文件,您可以在$_FILES['userfile']['type']中找到它

一旦你有了你的类型,你可以做一个简单的


另外,要当心上传内容的人,这些内容并不是它所说的那样。有人可以向您发送具有特定内容类型的文件,但它可能是可执行代码之类的东西!确保的唯一方法是使用自己的代码服务器端检查文件。永远不要相信用户输入。

正确的方法是在文件上使用。例如

$parts=pathinfo('somefile.jpg');
echo $parts['extension']; //Returns "jpg"
现在,您只需查看变量中的字符串,因此处理此问题的方法是

最后,您不应该按扩展名检测文件类型。这很糟糕。相反,您应该使用通常称为MIME类型的内容类型。对于上载的文件,您可以在$_FILES['userfile']['type']中找到它

一旦你有了你的类型,你可以做一个简单的


另外,要当心上传内容的人,这些内容并不是它所说的那样。有人可以向您发送具有特定内容类型的文件,但它可能是可执行代码之类的东西!确保的唯一方法是使用自己的代码服务器端检查文件。永远不要相信用户输入。

这将假定文件扩展名为三个字符。大多数是。。。但我见过jpeg文件的实际扩展名是.jpeg。这还假设存在一个扩展。更好的方法是找到文件名中的最后一个句点,然后检查之后的所有内容。上面dab的解决方案是一个好方法,但它再次假设事实上有一个扩展。。。。如果扩展名长度小于3个字符怎么办。js?这个问题并没有说仅仅是图像扩展。因为他所有的例子都是图像,所以他处理图像是一个公平的假设。查找最后一个句点也不是一个可行的选择,因为您可以使用诸如.tar.gz之类的扩展。最终这取决于他在做什么,这只是一个简单的例子,因为他问了一个非常简单的问题question@localhost-我处于争论的情绪中;怎么样?@LeguRi lol,不错的一个。我把这个问题主要解释为处理普通的图像文件,有些人通常会上传这些文件来处理GD。最终,这取决于OP想要完成什么。根据OP编辑原始问题的方式,看起来我是对的:假设文件扩展名是三个字符。大多数是。。。但我见过jpeg文件的实际扩展名是.jpeg。这还假设存在一个扩展。更好的方法是找到文件名中的最后一个句点,然后检查之后的所有内容。上面dab的解决方案是一个好方法,但它再次假设事实上有一个扩展。。。。如果扩展名长度小于3个字符怎么办。js?这个问题并没有说仅仅是图像扩展。因为他所有的例子都是图像,所以他处理图像是一个公平的假设。查找最后一个句点也不是一个可行的选择,因为您可以使用诸如.tar.gz之类的扩展。最终这取决于他在做什么,这只是一个简单的例子,因为他问了一个非常简单的问题question@localhost-我处于争论的情绪中;怎么样?@LeguRi lol,不错的一个。我把这个问题主要解释为处理普通的图像文件,有些人通常会上传这些文件来处理GD。最终,这取决于OP想要完成什么。根据OP编辑原始问题的方式,看起来我是正确的:@Gordon的副本,但Johnson的问题最初指的是字符串中的文件名,而不是磁盘上的现有文件。看来他已经编辑好了
hough,这可能已经改变。如果您的文件不存在,@Johnson,pathinfo的可能副本可能无法工作。你的文件存在吗?@Brad编辑不重要。从字符串中获取文件名,无论文件是否存在,都可以使用第一个问题中给出的函数来解决。第二个链接问题回答了如何确定用GD打开文件的MimeType。所以它是@Gordon的一个副本。可能是重复的,但Johnson的问题最初是指字符串中的文件名,而不是磁盘上现有的文件。看起来他已经编辑过了,这可能已经改变了。如果您的文件不存在,@Johnson,pathinfo的可能副本可能无法工作。你的文件存在吗?@Brad编辑不重要。从字符串中获取文件名,无论文件是否存在,都可以使用第一个问题中给出的函数来解决。第二个链接问题回答了如何确定用GD打开文件的MimeType。所以这是一个副本,+1,正要写这个。您可能还注意到,对于.tar.gz文件,is只返回.gz,这意味着它可能会执行类似substr$filename、strrpos'.'和$filename的操作来检索扩展名。还请注意,MIME类型可以由用户修改,因此仅基于MIME类型进行操作可能不太好。请参阅我更新的问题。我使用了aprtinfo方法,尽管它在技术上不适用于meTechnically,.gz是.tar.gz文件的扩展名,尽管我们人类不这么看。是的,关于MIME类型,你是对的,特别是在配置不好的计算机/浏览器可能无法提供任何具体信息的情况下,但我会在文件扩展名出现之前很久就依赖MIME类型,而文件扩展名在OS X上经常神秘地消失。没错,尽管最好的选择是检查文件内容本身。Johnson,为什么不起作用?你能给我们更多的信息吗。试试打印零件,告诉我们你看到了什么。另外,如果您运行的是古老的PHP,它可能不可用,但我怀疑情况是否如此。Array[dirname]=>images/status/photo[basename]=>1-886.jpg[extension]=>jpg[filename]=>1-886+1即将编写此文件。您可能还注意到,对于.tar.gz文件,is只返回.gz,这意味着它可能会执行类似substr$filename、strrpos'.'和$filename的操作来检索扩展名。还请注意,MIME类型可以由用户修改,因此仅基于MIME类型进行操作可能不太好。请参阅我更新的问题。我使用了aprtinfo方法,尽管它在技术上不适用于meTechnically,.gz是.tar.gz文件的扩展名,尽管我们人类不这么看。是的,关于MIME类型,你是对的,特别是在配置不好的计算机/浏览器可能无法提供任何具体信息的情况下,但我会在文件扩展名出现之前很久就依赖MIME类型,而文件扩展名在OS X上经常神秘地消失。没错,尽管最好的选择是检查文件内容本身。Johnson,为什么不起作用?你能给我们更多的信息吗。试试打印零件,告诉我们你看到了什么。此外,如果您运行的是古代PHP,它可能不可用,但我怀疑情况是否如此。Array[dirname]=>images/status/photo[basename]=>1-886.jpg[extension]=>jpg[filename]=>1-886您可以使用end$aPieces,而不是end$aPieces