Могу ли я использовать функцию md5_file для именования файлов при загрузке без конфликта с именами?
Вся идея в том, что мне нужно быть уверенным, что файл не был сохранен более одного раза и не потерял ни одного файла, потому что если файлы буксировки получат то же самое (md5), второй файл не будет сохранен(моя цель не сохранить Один и тот же файл дважды на жестком диске)
Другими словами, если один пользователь загружает изображение, а после этого другой пользователь загружает то же изображение, мне не нужно сохранять второе изображение, потому что все это уже существует на жестком диске, потому что мне нужно сэкономить место на моем жестком диске. это мой код работает нормально
$targetFolder = '/test/uploadify/uploads'; // Relative to the root
$tempFile = $_FILES['Filedata']['tmp_name'];
$targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
$myhash = md5_file($_FILES['Filedata']['tmp_name']);
$temp = explode(".", $_FILES['Filedata']['name']);
$extension = end($temp);
$targetFile = rtrim($targetPath,'/') . '/' .$myhash.'.'.$extension;
if(file_exists($targetFile)){
echo 'exist';
}
// Validate the file type
$fileTypes = array('jpg','jpeg','gif','png'); // File extensions
$fileParts = pathinfo($_FILES['Filedata']['name']);
if (in_array($fileParts['extension'],$fileTypes)) {
move_uploaded_file($tempFile,$targetFile);
}
else {
echo 'Invalid file type.';
}
спасибо всем вам
4 ответа
Ну, конечно, вы можете сделать это, на самом деле это способ, которым я использую, чтобы избежать дублирования файлов (и я имею в виду не иметь два файла с одинаковым содержимым, а не просто глупое столкновение имен).
Если вы беспокоитесь о столкновениях, вы можете взглянуть на sha1_file:
http://es1.php.net/manual/en/function.sha1-file.php
Каковы шансы, что два сообщения имеют один и тот же дайджест MD5 и один и тот же дайджест SHA1?
Я использовал подход md5, как вы предлагаете для галерей изображений, и он работает просто отлично.
Еще одна вещь, о которой нужно позаботиться, это время, которое требуется для вычисления хэша, чем сложнее хэш, тем больше времени требуется, но я говорю об обработке действительно больших пакетов.
Если я правильно понимаю ваш вопрос, ваша цель - просто создать уникальные имена файлов. Если это так, нет смысла заново изобретать колесо - каждая хеш-функция с фиксированной выходной длиной будет иметь коллизии - просто используйте встроенную функцию tempnam.
Ручное состояние:
Создает файл с уникальным именем файла с разрешением доступа, установленным на 0600, в указанном каталоге. Если каталог не существует, tempnam() может сгенерировать файл во временном каталоге системы и вернуть полный путь к этому файлу, включая его имя.
Следующее должно работать достаточно хорошо:
$targetDirectory = $_SERVER['DOCUMENT_ROOT'] . '/test/uploadify/uploads';
$uploadedFile = $_FILES['Filedata']['tmp_name'];
$targetFile = tempnam($targetDirectory, '');
move_uploaded_file($uploadedFile, $targetFile);
Это очень мало, но шанс есть. Вы можете прочитать больше здесь и здесь
Я предлагаю вам добавить соль в конец имени файла, чтобы практически невозможно было конфликтовать между файлами (хотя вы должны поместить соль в другую функцию md5)
$salt = md5(round(microtime(true) * 1000));
$hash = md5_file($_FILES['Filedata']['tmp_name']);
$targetFile = rtrim($targetPath,'/') . '/' .$hash.$salt.'.'.$extension;
Затем вы должны вставить имя файла в базу данных, чтобы вы могли получить к нему доступ позже.
Вы всегда можете добавить текущее время системы в миллисекундах к имени файла. Это плюс md5, очень маловероятно, чтобы вернуть те же значения.