PHP文件_是否以内容而不是名称存在?

PHP文件_是否以内容而不是名称存在?,php,file-get-contents,file-exists,Php,File Get Contents,File Exists,PHP中是否内置了一个类似于file\u的函数,但它只提供文件内容而不是文件名 我需要这个,因为我有一个网站,人们可以上传图像。图像存储在一个文件中,其名称由我的程序确定(image\u 0.png image\u 1.png image\u 2.png image\u 3.png image\u 4.png…)。我不希望我的网站有多个相同内容的图像。如果多人在互联网上找到一张图片,并将其上传到我的网站上,就会发生这种情况。我想检查是否已经有一个包含上载文件内容的文件要保存在存储中。您可以使用w

PHP中是否内置了一个类似于
file\u的函数,但它只提供文件内容而不是文件名


我需要这个,因为我有一个网站,人们可以上传图像。图像存储在一个文件中,其名称由我的程序确定(
image\u 0.png image\u 1.png image\u 2.png image\u 3.png image\u 4.png…
)。我不希望我的网站有多个相同内容的图像。如果多人在互联网上找到一张图片,并将其上传到我的网站上,就会发生这种情况。我想检查是否已经有一个包含上载文件内容的文件要保存在存储中。

您可以使用while循环查看所有文件的内容。如下例所示:

function content_exists($file){
  $image = file_get_contents($file);
  $counter = 0;
  while(file_exists('image_' . $counter . '.png')){
    $check = file_get_contents('image_' . $counter . '.png');
    if($image === $check){
      return true;
    }
    else{
      $counter ++;
    }
  }
  return false;
}
上面的函数查看所有文件,并检查给定图像是否与已存储的图像匹配。如果图像已经存在,则返回
true
,如果图像不存在,则返回
false
。下面是如何使用此功能的示例:

if(content_exists($_FILES['file']['tmp_name'])){
  // upload
}
else{
  // do not upload
}

您可以使用while循环查看所有文件的内容。如下例所示:

function content_exists($file){
  $image = file_get_contents($file);
  $counter = 0;
  while(file_exists('image_' . $counter . '.png')){
    $check = file_get_contents('image_' . $counter . '.png');
    if($image === $check){
      return true;
    }
    else{
      $counter ++;
    }
  }
  return false;
}
上面的函数查看所有文件,并检查给定图像是否与已存储的图像匹配。如果图像已经存在,则返回
true
,如果图像不存在,则返回
false
。下面是如何使用此功能的示例:

if(content_exists($_FILES['file']['tmp_name'])){
  // upload
}
else{
  // do not upload
}

这就是使用PHP精确比较两个文件的方法:

function compareFiles($file_a, $file_b)
{
    if (filesize($file_a) == filesize($file_b))
    {
        $fp_a = fopen($file_a, 'rb');
        $fp_b = fopen($file_b, 'rb');

        while (($b = fread($fp_a, 4096)) !== false)
        {
            $b_b = fread($fp_b, 4096);
            if ($b !== $b_b)
            {
                fclose($fp_a);
                fclose($fp_b);
                return false;
            }
        }

        fclose($fp_a);
        fclose($fp_b);

        return true;
    }

    return false;
}
如果您保留接受的每个文件的sha1总和,您可以简单地:

if ($known_sha1 == sha1_file($new_file))

这就是使用PHP精确比较两个文件的方法:

function compareFiles($file_a, $file_b)
{
    if (filesize($file_a) == filesize($file_b))
    {
        $fp_a = fopen($file_a, 'rb');
        $fp_b = fopen($file_b, 'rb');

        while (($b = fread($fp_a, 4096)) !== false)
        {
            $b_b = fread($fp_b, 4096);
            if ($b !== $b_b)
            {
                fclose($fp_a);
                fclose($fp_b);
                return false;
            }
        }

        fclose($fp_a);
        fclose($fp_b);

        return true;
    }

    return false;
}
如果您保留接受的每个文件的sha1总和,您可以简单地:

if ($known_sha1 == sha1_file($new_file))

您可以将散列文件存储在一个由
\n
分隔的
.txt
文件中,以便使用以下功能:

function content_exists($file){
  $file = hash('sha256', file_get_contents($file));
  $files = explode("\n", rtrim(file_get_contents('files.txt')));
  if(in_array($file, $files)){
    return true;
  }
  else{
    return false;
  }
}
然后,您可以使用它来确定是否应保存文件,如下所示:

if(content_exists($_FILES['file']['tmp_name'])){
  // upload
}
else{
  // do not upload
}
只需确保在存储文件时,使用以下代码行:

file_put_contents('files.txt', hash('sha256', file_get_contents($file)) . "\n");

您可以将散列文件存储在一个由
\n
分隔的
.txt
文件中,以便使用以下功能:

function content_exists($file){
  $file = hash('sha256', file_get_contents($file));
  $files = explode("\n", rtrim(file_get_contents('files.txt')));
  if(in_array($file, $files)){
    return true;
  }
  else{
    return false;
  }
}
然后,您可以使用它来确定是否应保存文件,如下所示:

if(content_exists($_FILES['file']['tmp_name'])){
  // upload
}
else{
  // do not upload
}
只需确保在存储文件时,使用以下代码行:

file_put_contents('files.txt', hash('sha256', file_get_contents($file)) . "\n");

不过,要考虑二次行为。有没有更快的方法可以重新计算?先存储散列并比较它们。不过,请确保验证误报。因此,在上载图像时,对内容进行散列,然后比较其他存储的散列,如果不存在相同的散列,则进行上载。对吗?我很乐意接受这个答案,如果它是一个带有示例的答案:),我知道你的意思,但我不想从你的想法中得出一个答案。不过,期待二次行为。有没有更快的方法重新计算?先存储哈希并比较它们。不过,请确保验证误报。因此,在上载图像时,对内容进行散列,然后比较其他存储的散列,如果不存在相同的散列,则进行上载。是吗?我很乐意接受这个答案,如果它是一个带有示例的答案:),我知道你的意思,但我不想从你的想法中得出答案。是的,但是你怎么能看到一个包含该内容的文件已经存在,如果没有文件名为file_b,你是否只需要在我的答案中使用while循环来遍历所有文件?是的,恐怕。比较sha和是更快的方法,你可以在你的文件名中包含大小参考,并且只检查大小相似的文件。是的,但是如果没有文件的名称,你怎么看一个包含该内容的文件是否已经存在,你是否只需要在我的回答中使用while循环来检查所有文件?是的,我担心。比较sha和是更快的方法,您可以在文件名中包含大小引用,并只检查大小相似的文件。