使用PHP获取图像文件扩展名

时间:2015-04-26 17:04:47

标签: php file

文件名已知但文件扩展名未知。其他文件夹中的图像确实有扩展名,但在数据库中它们的名称不具有扩展名。

示例:

$ImagePath = "../images/2015/03/06/";   (Folders are based on date)
$ImageName = "lake-sunset_3";

不起作用 - $ Ext为空:

$Ext  = (new SplFileInfo($ImagePath))->getExtension();
echo $Ext;

也不起作用 - $ Ext为空:

$Ext  = (new SplFileInfo($ImagePath.$ImageName))->getExtension();
echo $Ext;

也不起作用 - $ Ext仍为空:

$Ext  = (new SplFileInfo($ImagePath,$ImageName))->getExtension();
echo $Ext;

$ Ext应该生成" .jpg"或" .jpeg"或" .png"等

所以我的问题很简单:我做错了什么?

5 个答案:

答案 0 :(得分:1)

现在,这是一个丑陋的解决方案,但它应该有效。确保您的所有文件都有唯一的名称,否则您将拥有多个相同的文件,这可能会导致您的程序获得错误的文件。

<?php
$dir = scandir($imagePath);
$length = strlen($ImageName);
$true_filename = '';
foreach ($dir as $k => $filename) {
    $path = pathinfo($filename);
    if ($ImageName === $path['filename']) {
        break;
    }
}
$Ext = $path['extension'];

?>

答案 1 :(得分:0)

您正在调用名为lake-sunset_3的文件。它没有扩展名。

SplFileInfo::getExtension()并非旨在执行您要求它执行的操作。

来自php网站:

  

返回包含文件扩展名的字符串,如果文件没有扩展名,则返回空字符串。

http://php.net/manual/en/splfileinfo.getextension.php

相反,你可以这样做:

$path = $_FILES['image']['name'];
$ext = pathinfo($path, PATHINFO_EXTENSION);

答案 2 :(得分:0)

getExtension()仅返回给定路径的扩展名,在您的情况下,该扩展名当然没有。

一般来说,这是不可能的。如果文件lake-sunset_3.jpg和文件lake-sunset_3.png

怎么办?

您唯一能做的就是扫描目录并查找具有该名称但任何扩展名的文件。

答案 3 :(得分:0)

你试图调用一条不完整的路径。您可以尝试使用Digit的hack来查看目录以查找与该名称匹配的文件,或者您可以尝试通过添加扩展名来查找该文件,即:

 $basePath = $ImagePath . $ImageName;
 if(file_exists($basePath . '.jpg'))
     $Ext = '.jpg';
 else if(file_exists($basePath . '.gif'))
     $Ext = '.gif';
 else if(file_exists($basePath . 'png'))
     $Ext = '.png';
 else
     $Ext = false;
除了丑陋的黑客外,还有一个问题是,为什么你在没有扩展的情况下存储它们?如果需要,剥离扩展名会比尝试查找没有扩展名

的文件更容易

答案 4 :(得分:0)

也许这可能对你有所帮助(另一种粗暴和丑陋的解决方案) -

$dir = '/path/to/your/dir';
$found = array();
$filename = 'your_desired_file';

$files = scandir($dir);

if( !empty( $files ) ){
    foreach( $files as $file ){
        if( $file == '.' || $file == '..' || $file == '' ){
            continue;
        }

        $info = pathinfo( $file );

        if( $info['filename'] == $filename ){
            $found = $info;
            break;
        }
    }
}

// if file name is matched, $found variable will contain the path, basename, filename and the extension of the file you are looking for

修改

如果你只想要你的形象,那么你需要照顾两件事。第一个directory pathdirectory uri不是一回事。如果您需要使用文件,则必须使用directory path。要提供静态文件(如图像),您必须使用directory uri。这意味着如果您需要检查文件是否存在,那么您必须使用/absolute/path/to/your/image以及图像[site_uri]/path/to/your/image/filename。看到差异?上面示例中的$ found变量是一个数组 -

$found = array(
    'dirname' => 'path/to/your/file',
    'basename' => 'yourfilename.extension',
    'filename' => 'yourfilename',
    'extension' => 'fileextension'
);

// to retrieve the uri from the path.. if you use a CMS then you don't need to worry about that, just get the uri of that directory.

function path2url( $file, $Protocol='http://' ) {
    return $Protocol.$_SERVER['HTTP_HOST'].str_replace($_SERVER['DOCUMENT_ROOT'], '', $file);
}

$image_url = path2url( $found['dirname'] . $found['basename'] ); // you should get the correct image url at this moment.