PHP file_exists с содержанием вместо имени? - PullRequest
0 голосов
/ 25 апреля 2018

Есть ли встроенная в PHP функция, которая действует как file_exists, но с указанием содержимого файла вместо имени файла?

Мне это нужно, потому что у меня есть сайт, где люди могут загружать изображения.Изображение хранится в файле с именем, определенным моей программой (image_0.png image_1.png image_2.png image_3.png image_4.png ...).Я не хочу, чтобы на моем сайте было несколько изображений с одинаковым содержанием.Это может произойти, если несколько человек найдут картинку в интернете и все они загрузят ее на мой сайт.Я хотел бы проверить, существует ли уже файл с содержимым загруженного файла для сохранения в хранилище.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Вот как вы можете сравнить ровно два файла с 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))
0 голосов
/ 25 апреля 2018

Вы можете хранить хэшированные файлы в .txt файле, разделенном \n, чтобы вы могли использовать следующую функцию:

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
}

Просто убедитесь, что при сохранении файла IS используется следующая строка кода:

file_put_contents('files.txt', hash('sha256', file_get_contents($file)) . "\n");
0 голосов
/ 25 апреля 2018

Вы можете использовать цикл 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
}
...