【问题标题】:how to get the extension of a image file with known filename not extension如何获取具有已知文件名而不是扩展名的图像文件的扩展名
【发布时间】:2013-06-02 02:30:02
【问题描述】:

我有一个简单的上传图片功能,用户可以在其中选择要为个人资料图片上传的图片。图像功能允许每种类型的图像。一旦用户上传图像文件,它会保存在我指定的公共文件夹中的目录中,名称将更改为类似这样。

if the userId = 32
then the image will be stored as 32.ext

其中“ext”是图像的扩展名。

我的问题是当用户完成上传并转到个人资料页面时检索图像。我只能做一种文件类型,比如 jpg 而不是 png 或任何扩展名。

<img src="<?php echo "/public/images/event/".$userDetails->id.".jpg";?>" />

我的问题是如何检查扩展名,根据扩展名,它会像这样显示。 假设用户上传了一个 png 文件,输出将是 32.png ,但现在我将文件扩展名硬编码为 jpg。

【问题讨论】:

    标签: php image


    【解决方案1】:

    你可以像这样在php中找到文件扩展名:

    $file_parts = pathinfo($filename);
    
    $file_extension = $file_parts['extension'];
    

    或者如果你不知道扩展名,你必须这样做:

    $dirname  = "./somedir/"; 
    $filename = "myfile"; 
    $iterator = new RegexIterator(new DirectoryIterator($dirname), '/^' . preg_quote($filename) . '\.[^.]+$/iD'); 
    
    // Any matching files? 
    if (iterator_count($iterator) > 0) { 
        echo "Matches found:\n"; 
    } else { 
        echo "No matches found.\n"; 
    } 
    
    // Get extensions of matching files 
    foreach ($iterator as $fileinfo) { 
        printf("%s -> %s\n", $fileinfo, pathinfo($fileinfo, PATHINFO_EXTENSION)); 
    }
    

    http://www.sitepoint.com/forums/showthread.php?631513-possible-check-if-file-filename-exists-w-o-knowing-its-extension所见

    【讨论】:

    • 您确定该文件已找到并且有扩展名吗?
    • veelen:文件保存方式如下 userid.extension 。因此,当我执行 $filename = imagepath/userid 时,它不会给我扩展名,因为我不知道那是什么类型,因此它说 null
    • 我已经为你修改了答案。
    • veelen:这行得通。但是这个脚本的一个缺点是 foreach 循环会杀死系统。我有用户 ID,我只需要附加扩展名。
    • 它是如何杀死你的系统的?
    【解决方案2】:

    您可以在服务器端使用 $_FILES 或 pathinfo()

    $extension = $_FILES["file"]["type"]; 
    

    $extension = pathinfo($filename, PATHINFO_EXTENSION);
    

    【讨论】:

    • 它必须包含在您正在处理上传图像的服务器端。
    【解决方案3】:
    <?php
    
    $directory_path="/public/images/event/";
    
    $matches = glob($directory_path.$userDetails->id.".*");
    
    //assuming there is only one user id expect only one file in the array 
    $image_file=$matches[0];
    
    $extension=pathinfo($image_file, PATHINFO_EXTENSION);
    echo "<img src='".$directory_path.$userDetails->id.$extension."' />";
    

    【讨论】:

    • 贝雷:不。它不工作。扩展它没有拿起。它只捡起 id。
    【解决方案4】:

    您手头有几个解决方案。

    1. 将每个图像转换为您支持的一种格式,即使它似乎已经是那种格式。这样做的好处是增加了安全性,因为转换希望不会受到图像内恶意负载的影响,而只会转换或复制像素信息,否则会创建一个全新的图像。

    2. 忽略提供用户上传内容的安全隐患,您也可以在上传文件时通过在文件上使用getimagesize() 来获取文件类型,并将检测到的文件类型存储在您的数据库中并使用它文件扩展名本身的信息。请注意,浏览器可能已经实现了将 JPG 视为 JPG 的后备机制,即使服务器说扩展名是“.gif”并且 mime 类型是“image/png”。用户可以并且将无法上传具有与真实内容匹配的正确扩展名的图像。期待得到各种奇怪的格式。

    3. 您还可以更改完全了解图像名称的方式。只需将其存储在数据库中 - 这仅比仅存储扩展名稍微多一点开销。但是,您不能仅仅通过知道用户 ID 来简单地创建图像名称。

    4. 不需要在 URL 中添加扩展名。浏览器的唯一要求是应该有一个匹配内容的 mimetype。但是实现了自动检测,即使使用错误的 mimetype,您最终也可能会显示图像,而且 Apache 网络服务器可能已经实现了 mime-magic 检测,并且将为所提供的每个图像发送正确的 mimetype,而无需文件扩展名。

    【讨论】:

    • 到目前为止,我已禁用除 jpeg 文件以外的上传。但会尝试提出一个答案。谢谢你的信息。有帮助,但目前尚未在我的代码库中实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多