Хочу сделать чтобы при выгрузке файла в Джоне, шла проверка по размеру или содержимому. (Или хотя бы выводился список похожих Загрузок ориентируясь по названию). Чтобы пользователи не плодили копии одних и тех же файлов.
Подскажите куски кода, которыми можно это сделать на РНР7.
И было бы полезно услышать комментарии как оптимизировать это дело (если надо/возможно)?
Chifty,
Тынц md5-file
Ну и при загрузке хеш записывать в таблицу с файлами, если хеши совпадают, второй файл не сохранять, а просто ссылку на уже существующий сделать.
Неплохо было бы разжиться куском кода, который выводит уведомление с ссылкой, на существующий файл.
А также куском кода, который бы искал загрузки с похожим названием (например по совпадению 5ти знаков подряд в имени)
Chifty, Ну так ты покажи на чем остановился, а то вариаций может быть столько, сколько сайтов в интернете
Добавлено: 08.09.2018 / 08:02
Остановился ещё на стадии планирования куда лучше писать хэш - в дополнительное поле к загрузке или в отдельную таблицу. Чтобы оптимальнее по нагрузке.
И как потом сгенерировать хэш для уже имеющихся файлов?
А насчёт поиска по имени я что-то не разобрался как искать совпадение нескольких символов подряд, если обе строки разные по длине и совпадение может быть в разных концах строк. (такой поиск вообще возможен?)
Добавлено: 08.09.2018 / 10:49
Короче придумал я как примерно оно будет.
Будет отдельная таблица: ИД загрузки / РЕФИД дополнительного файла (если есть) / ИМЯ загрузки или дополнительного файла / РАЗМЕР в байтах / ХЕШ
По алгоритму: При выгрузке файла сравнивается размер в байтах, если совпадений меньше 3, выводим предупреждение с списком совпадений и кнопкой "Продолжить". Если больше 3 - сравниваем хэш-суму с совпадающими строками из списка, если есть совпадение - выводим предупреждение с ссылкой на дубль икнопкой "отменить", если нетсовпадений - выполнять скрипт заливки дальше.
Приветствуется разумная критика
Может вообще хэш добавить сразу в таблицу с загрузками? (Хотя туту меня несколько вопросов:
В download__files нет поля size, в downloads__more - есть. Хотя из первой таблицы размер файла откуда-то берётся.
Не слишком ли напряжно будет MySQL соединять две полных таблицы (обьем получится большой. например если 100к файлов. и еще 300к дополнительных файлов)
Какие поля в новой таблице надо будет индексировать? я с оптимизацией на ВЫ
Может я много лишнего предлагаю в своем алгоритме? Просто бывает например 2 версии файла, полностью одинаковых по размеру, но с разным MD5. А по сути, это один и тот же файл... Или такого не может быть?
Такого не может быть(если только один случай из лярда)
Раз хеш одинаковый то хоть как файл переименуй он один и тот же останется. Не давно картинки так переделывал, я те пример скину, а ты сам разбирайся
example (+/-)
if (!empty($_FILES['file'])) {
$upload = Core\Upload::factory('loads', __dir__ . '/../');
$upload->file($_FILES['file']);
$validation = new validation;
// check name leigth and mime type
$upload->callbacks($validation, array('check_name_length','check_mime_type'));
// set max. file size (in mb)
$upload->set_max_file_size(2);
$fileformat = strrchr($_FILES['file']['name'], '.');
if (isset($_POST['auto']) || preg_match('/[а-яё]+/i', $_FILES['file']['name'])) {
$filesme = uniqid('image_') . $fileformat;
} else {
$filesme = $_FILES['file']['name'];
}
$hash_file = md5_file($_FILES['file']['tmp_name']);
if (!$file_name = $db->query('SELECT `file` FROM `pic_files` WHERE `hash_file`=?', [$hash_file])->el()) {
$results = $upload->upload($filesme);
} else {
$filesme = $file_name;
$results['status'] = true;
$err = 'Такой файл уже загружен, ваш файл переименован!';
}
}
if ($results['status']) {
$id_cat = intval($_POST['cat']);
$file_id = $db->query(
'INSERT INTO `pic_files` (`id_cat`, `file`, `hash_file`, `time_d`, `time_s`, `time`, `id_user`) VALUES(?i, ?, ?, ?i, ?i, ?i, ?i)',
[$id_cat, $filesme, $hash_file, time(), time(), time(), $user['id']])->id();
echo '<div class="msg">Файл успешно добавлен</div>';
} else {
$err = $results['errors'];
}
Хеш существующих файлов можно записать в таблицу как то так
select `name` /* или ай-ди в зависимости как у тебя файлы на диске названы */ from tbl
while () {
// тут пройти по файлам с $hash = md5_file('path_to_file');
update tbl set hash=$hash where id;
}
kantry, Ты этот говнокласс используешь для мускула?
Мд5 будет достаточно. Можно ещё и файлы положить по папкам с хэш
https://github.com/Compolomus/ ... orage
# Koenig (09.09.2018 / 12:03)
kantry, Ты этот говнокласс используешь для мускула?
goDB что ли, с чего бы он говном то стал?
Просто md5 не рекомендовал бы использовать. Сталкивался с пересечениями даже при количестве файлов в 4к штук.
Комбо вариант используйте. храните 2 хэша md5_file и sha1_file. Так вероятность пересечения будет меньше.
ну так накидайте набросок кода для 7го джона, пожалуйста