文件名已知但文件扩展名未知。其他文件夹中的图像确实有扩展名,但在数据库中它们的名称不具有扩展名。
示例:
$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"等
所以我的问题很简单:我做错了什么?
答案 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 path
和directory 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.