我见过几个网站,如果你上传了一张图片,而服务器上已经存在相同的图片,他们会拒绝提交。使用PNG有没有一种简单的方法可以将一张图像与一个庞大的图像文件夹进行检查?
http://www.imagemagick.org/discourse-server/viewtopic.php?t=12618
我确实在imagemagick中发现了这一点,但我正在寻找一对多,而不是一对一的百万
您可以将文件内容转换为sha1。这将为您提供一种方法来识别两张完全相同的图片。
参见http://php.net/manual/fr/function.sha1-file.php
然后将其保存到NFS中,或者使用某种数据库来测试哈希是否已经存在。
图像的详细信息可能保存在数据库中;而图像被存储在文件系统中。该数据库可能有一个散列列,用于存储图像文件本身的md5散列,该散列是在图像首次上传时计算的。上传新图像时,它会计算该图像的哈希,然后检查数据库中是否有其他图像细节具有匹配的哈希。如果不是,它将新上传的图像与该散列一起存储;否则,它可以用以前上传的详细信息进行响应。如果哈希列在表中被索引,那么这个检查是非常快的。
如果我正确理解你的问题您想知道一个目录中是否存在一个特定的映像,该目录中有这么多映像,对吗?如果是,请查看解决方案:
<?php
// CREATE A FUNCTION WHICH RETURNS AN ARRAY OF ALL IMAGES IN A SPECIFIC FOLDER
function getAllImagesInFolder($dir_full_path){
$returnable = array();
$files_in_dir = scandir($dir_full_path);
$reg_fx = '#(.png|.jpg|.bmp|.gif|.jpeg)#';
foreach($files_in_dir as $key=>$val){
$temp_file_or_dir = $dir_full_path . DIRECTORY_SEPARATOR . $val;
if(is_file($temp_file_or_dir) && preg_match($reg_fx, $val) ){
$regx_dot_wateva = '/.{2,4}$/';
$regx_dot = '/./';
$regx_array = array($regx_dot_wateva, $regx_dot);
$replace_array = array("", "_");
$return_val = preg_replace($regx_array, $replace_array, $val);
$returnable[$return_val] = $temp_file_or_dir ;
}else if(is_dir($temp_file_or_dir) && !preg_match('/^..*/', $val) ){
getFilesInFolder($temp_file_or_dir);
}
}
return $returnable;
}
// CREATE ANOTHER FUNCTION TO CHECK IF THE SPECIFIED IMAGE EXISTS IN THE GIVEN DIRECTORY.
// THE FIRST PARAMETER SHOULD BE THE RESULT OF CALLING THE PREVIOUS FUNCTION: getAllImagesInFolder(...)
// THE SECOND PARAMETER IS THE IMAGE YOU WANT TO SEARCH WHETHER IT EXISTS IN THE SAID FOLDER OR NOT
function imageExistsInFolder($arrImagesInFolder, $searchedImage){
if(!is_array($arrImagesInFolder) && count($arrImagesInFolder) < 1){
return false;
}
foreach($arrImagesInFolder as $strKey=>$imgPath){
if(stristr($imgPath, $searchedImage)){
return true;
}
}
return false;
}
// NOW GET ALL THE IMAGES IN A SPECIFIED FOLDER AND ASSIGN THE RESULTING ARRAY TO A VARIABLE: $imgFiles
$imgFolder = "/path/to/directory/where/there/are/images";
$arrImgFiles = getAllImagesInFolder($imgFolder);
$searchedImage = "sandwich.jpg"; //<== OR EVEN WITHOUT THE EXTENSION, JUST "sandwich"
// ASSUMING THE SPECIFIC IMAGE YOU WANT TO MATCH IS CALLED sandwich.jpg
// YOU CAN USE THE imageExistsInFolder(...) FUNCTION TO RETURN A BOOLEAN FLAG OF true OR false
// DEPENDING ON IF IT DOES OR NOT.
var_dump($arrImgFiles);
var_dump( imageExistsInFolder($arrImgFiles, $searchedImage) );