Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP获取图像文件扩展名_Php_File - Fatal编程技术网

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

使用PHP获取图像文件扩展名,php,file,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 = (new SplF

文件名已知,但文件扩展名未知。这些文件夹中的图像确实有扩展名,但在数据库中它们的名称没有扩展名

例如:

$ImagePath = "../images/2015/03/06/";   (Folders are based on date)
$ImageName = "lake-sunset_3";
不工作-$Ext为空:

$Ext  = (new SplFileInfo($ImagePath))->getExtension();
echo $Ext;
$Ext  = (new SplFileInfo($ImagePath.$ImageName))->getExtension();
echo $Ext;
也不起作用-$Ext为空:

$Ext  = (new SplFileInfo($ImagePath))->getExtension();
echo $Ext;
$Ext  = (new SplFileInfo($ImagePath.$ImageName))->getExtension();
echo $Ext;
也不起作用-$Ext仍然为空:

$Ext  = (new SplFileInfo($ImagePath,$ImageName))->getExtension();
echo $Ext;
$Ext应生成“.jpg”或“.jpeg”或“.png”等


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

您正在调用一个名为
lake-sunset_3
的文件。它没有分机

SplFileInfo::getExtension()
不是设计用来执行您请求它执行的操作的

从php站点:

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

相反,您可以这样做:

$path = $_FILES['image']['name'];
$ext = pathinfo($path, PATHINFO_EXTENSION);
getExtension()
只返回给定路径的扩展名,在您的情况下,当然没有

一般来说,这是不可能的。如果有一个文件
lake-sunset_3.jpg
和一个文件
lake-sunset_3.png
,该怎么办


你唯一能做的就是扫描目录,寻找一个具有该名称但没有任何扩展名的文件。

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

<?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'];

?>

您试图调用的路径不完整。您可以尝试Digit在目录中查找与名称匹配的文件,也可以尝试通过添加扩展名来查找该文件,即:

 $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;
撇开丑陋的黑客不谈,我们需要问的问题是,为什么在没有扩展的情况下存储它们?如果需要的话,删除扩展名会比尝试查找没有扩展名的文件容易得多

也许这可能会对您有所帮助(另一个残酷而丑陋的解决方案)-

编辑

如果你只是想要你的图像的uri,那么你需要注意两件事。第一个
目录路径
目录uri
不是一回事。如果需要使用文件,则必须使用
目录路径
。要提供静态文件(如图像),则必须使用
目录uri
。这意味着,如果您需要检查文件是否存在,或者您必须使用
/absolute/path/to/your/image
,如果是image
[site\u 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.

如果还有一个名为
lake-sunset_32.jpg的文件会怎样?你所问的是真的,而且肯定是真的。原因是原始图像名称被替换为SEO字符串,该字符串也在其他区域用作页面的URL,例如。这就是为什么在数据库中存储图像名称时没有扩展名,尽管它们在文件夹中有扩展名。可以存储没有扩展名或带有自定义扩展名的图像,这样apache/nginx就可以为它们制定特殊规则(例如直接访问时显示它们而不是通过ftp发送它们)。所有当前的浏览器都会很高兴地读取文件头并正确地解释它们。在您的情况下,更好的设计理念是将图像名称及其扩展名存储在数据库中,然后在输出它们时使用pathinfo()删除它们的扩展名。谢谢。我现在正在尝试这个例子,但仍然没有成功——例子:谢谢。我正在尝试这个示例,但仍然没有成功-示例:$ImageName=“lake-sunset_3”$ImagePath=“../images/2015/03/06/”$dir=scandir($ImagePath)$长度=strlen($ImageName)$true_filename='';foreach($k=>$filename){if($ImageName===substr($filename,0,$length))$true\u filename=$filename;}echo$true\u filename$true\u文件名仍显示为空。是的,如果换一种方式做的话会更好,但是数据库/图像结构的原始设计是通过开放分类(开源代码)实现的,我正在添加一个额外的页面。谢谢你的回答。所讨论的图像文件在其各自的文件夹中确实有扩展名,但图像名称存储在数据库中,没有扩展名。我可以从数据库中检索图像名称,但无法从没有扩展名的文件夹中检索图像。我对我的问题进行了编辑,以使其更清楚。Yes Jimmy T你是对的,也可能是这样,你在这里的回答“扫描目录,查找具有该名称但具有任何扩展名的文件”似乎是正确的方法。谢谢你,nomistic-我也尝试过,但没有成功你是绝对正确的leitning,然而,代码和数据库结构不是我的设计,更改它们可能会破坏系统,并且肯定需要大量的代码。我希望保持系统的原样(它确实工作得很好),并将某些图像检索到新页面,让我们将新页面称为类似“顶级图像”的页面,但是获取这些图像有点困难。我已经检查并重新检查了文件路径和文件名,它们是正确的。下面的结果确实正确,但这是因为我自己添加了文件扩展名,所以我们知道图像路径和图像名是正确的,但是我不能使用.jpg,因为有些图像将是.png或.png。bmp.jpg“width=”100“height=”100“>我希望做的是这样的:“width=”100“height=”100“>谢谢maksbd19-这个答案运行,但echo$找到了;只生成单词“Array”(不带引号)。嗯,很奇怪。我已经把上面所有的答案都复习了一遍,结果都是零。我的意思不是批评,我感谢你们所有人的时间和回答——我只是觉得$ImagePath很奇怪$图像名称。“.jpg”生成正确的图像结果,但仍与来自t的任何结果相呼应