1

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

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。

4

4 回答 4

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-wo-knowing-its-extension所见

于 2013-06-06T07:25:58.787 回答
0

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

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

或者

$extension = pathinfo($filename, PATHINFO_EXTENSION);
于 2013-06-06T07:29:49.487 回答
0
<?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."' />";
于 2013-06-06T08:21:22.447 回答
0

您手头有几个解决方案。

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

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

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

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

于 2013-06-06T09:31:24.297 回答