使用 PHP 你怎么知道图像是否已经存在于你的服务器上而不考虑名称?
Using PHP how can you tell if the image already exists on your server regardless of name?
我见过几个网站,如果您上传图片并且服务器上已经存在相同的图片,他们将拒绝提交。使用 PNG 有没有一种简单的方法可以根据大量图像文件夹检查一张图像?
http://www.imagemagick.org/discourse-server/viewtopic.php?t=12618
我确实用 imagemagick 找到了这个,但我正在寻找一对多而不是百万分之一
图像的详细信息可能保存在数据库中;而图像存储在文件系统中。该数据库可能有一个哈希列,用于存储图像文件本身的 md5 哈希值,该哈希值是在首次上传图像时计算的。上传新图像时,它会计算该图像的哈希值,然后检查数据库中是否有任何其他图像细节具有匹配的哈希值。如果不是,它将使用该哈希值存储新上传的图像;否则它可以用之前上传的详细信息进行响应。如果散列列在 table 中编制索引,那么此检查非常快。
您可以将文件内容转换为 sha1。这将为您提供一种方法来识别两张图片严格相同。
见http://php.net/manual/fr/function.sha1-file.php
然后将其保存到 NFS 中,或使用某种数据库来测试哈希是否已经存在。
如果我没有正确理解你的问题。 你想知道一个特定的图像是否存在于一个有这么多图像的目录中,对吧?如果是这样,请查看解决方案:
<?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) );
我见过几个网站,如果您上传图片并且服务器上已经存在相同的图片,他们将拒绝提交。使用 PNG 有没有一种简单的方法可以根据大量图像文件夹检查一张图像?
http://www.imagemagick.org/discourse-server/viewtopic.php?t=12618
我确实用 imagemagick 找到了这个,但我正在寻找一对多而不是百万分之一
图像的详细信息可能保存在数据库中;而图像存储在文件系统中。该数据库可能有一个哈希列,用于存储图像文件本身的 md5 哈希值,该哈希值是在首次上传图像时计算的。上传新图像时,它会计算该图像的哈希值,然后检查数据库中是否有任何其他图像细节具有匹配的哈希值。如果不是,它将使用该哈希值存储新上传的图像;否则它可以用之前上传的详细信息进行响应。如果散列列在 table 中编制索引,那么此检查非常快。
您可以将文件内容转换为 sha1。这将为您提供一种方法来识别两张图片严格相同。
见http://php.net/manual/fr/function.sha1-file.php
然后将其保存到 NFS 中,或使用某种数据库来测试哈希是否已经存在。
如果我没有正确理解你的问题。 你想知道一个特定的图像是否存在于一个有这么多图像的目录中,对吧?如果是这样,请查看解决方案:
<?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) );