|
|
|
| Добрый день!
При разработке приложений, с помощью которых администратор сайта может загружать собственные файлы на сервер, возникает задача: как защитить уже существующие файлы от перезаписи новыми в случаи совпадения имен?
Сейчас я решаю этот вопрос добавлением уникального префикса ко всем загружаемым файлам. А в качестве префикса использую результат, возвращаемый функцией time().
Но в этом случаи первоначальное имя файла достаточно сильно искажается и визуально его прочесть тяжеловато. Поэтому это не очень удобно посетителям сайта, которые загружают файлы с сайта(по названию становится трудно определить что же находится в файле).
Скажите, кто как решает эту задачу? | |
|
|
|
|
|
|
|
для: tihonko
(18.03.2010 в 14:12)
| | Ссылки на файлы в базе есть? Там же можно хранить и оригинальное имя файла. | |
|
|
|
|
|
|
|
для: sim5
(18.03.2010 в 14:35)
| | Спасибо, хорошая идея! В этом случаи мы видимое на странице имя файла(которое является ссылкой на сам файл) улучшим.
Но если посетитель сайта кликнет по ссылке, которая ведет на сам файл, то браузер в диалоговом окне предложит загрузить или открыть эту абру-кадабру) | |
|
|
|
|
|
|
|
для: tihonko
(18.03.2010 в 15:31)
| | А вы файлы как отдаете, посредством скрипта? И какая тогда проблема указать реальное имя файла, под которым его и скачает клиент? И пользователь в диалоге не аброкадабру увидит, а нормальное имя, причем не надо никаких транслитов идиотских.
P.S. Кстати, одно и тоже имя, это надо просто исключать. Что могут говорить пользователю ссылки на файлы с одинаковыми именами? | |
|
|
|
|
|
|
|
для: sim5
(19.03.2010 в 04:02)
| | Я разрабатываю класс, который будет использоваться в CMS для загрузки файлов. В последующем администратор сайта сможет выкладывать ссылки на произвольных страницах сайта на эти файлы. Задача - сделать так, чтобы при загрузки 2 файлов с одинаковыми именами это не привело к перезаписи одного из них другим и чтобы исходное имя файла, после сохранения его на сервере, не слишком искажалось.
Если сохранять оригинальное имя файла в базе как вы предложили, то его можно использовать в качестве ссылки в последующем. Согласен, это хорошая идея. Но помимо этого нужно также устранить коверканье имени файла после его загрузки. Т.е. чтобы он на сервере тоже назывался понятным образом) | |
|
|
|
|
|
|
|
для: tihonko
(19.03.2010 в 07:19)
| | Имя файлу под которым он будет лежать на диске, можно давать какое угодно. Хотите париться с одинаковыми, резмещайте их в разные каталоги. Я вам ведь не об этом говорю, а об истинном имени. У вас на диске может быть файл 1.txt, а реально он будет называться "Мама мыла раму", но если еще кто-то захочет написать об этом, то согласитесь, что первый должен тогда быть, например, как "Мама мыла раму (классическое из Азбуки)", а второй "Мама мыла раму (взгляд прохожего)", и лежать под именем хоть 123.txt.
Как пользователю принимать решение о том, одинаковы ли по содержанию эти файлы? Ну сохраните вы их под одинаковыми именами, заботясь о своем благе, а об удобстве пользователя забыли?
Классы, CMS..., это рояли не играет, достаточно администратору указать, что такое имя файла уже есть, даже дать ему почитать анонс его, это не так трудно, и руки у него не отвалятся дать имя отличное или добавить к нему нечто для отличия, а физическое имя файлу автоматом, без его участия. | |
|
|
|
|
|
|
|
для: sim5
(19.03.2010 в 07:32)
| | Истинные имена будут удобны для пользователей. Об этом позабочусь! | |
|
|
|
|
|
|
|
для: tihonko
(18.03.2010 в 14:12)
| | А если в конец названия поставить переменную счетчика?
file_1, file_2, file_3 и проверять, если есть такой файл, то счетчик увеличивается на единицу.
Чисел все-таки будет меньше, чем c time(); | |
|
|
|
|
|
|
|
для: Лена
(18.03.2010 в 14:43)
| | Отличная идея, спасибо! | |
|
|
|
|
|
|
|
для: tihonko
(18.03.2010 в 15:33)
| | sim5, Лена
Синтезируя обе ваши идеи задача прекрасно решается!
Да здравствует коллективный разум! | |
|
|
|
|
|
|
|
для: tihonko
(18.03.2010 в 15:39)
| | Позвольте Вам процитировать самого себя:
у Вас было бы меньше геморроя если бы имя хранимого файла было бы не Rock n' Roll.7z, а идентификатор строки БД соответствующий этому названию т.е. 56743.7z
к тому же я не знаю как эти архивы попадают к Вам и кто следит за одинаковыми именами файлов, а при использовании варианта с идентификатором про уникальность можно не думать в пределах разумного...
отвечал вчера в соседней ветке, но думаю проблема будет жить вечно... книжки-то просто так печатают... кому они нужны читать их ещё | |
|
|
|
|
|
|
|
для: Valick
(18.03.2010 в 16:33)
| | >отвечал вчера в соседней ветке, но думаю проблема будет жить вечно... книжки-то просто так печатают... кому они нужны читать их ещё
Похоже что действительно зря. По крайней мере по юзабилити. Кому они нужны-то. Читать их еще......
Что интересно будет, если пользователям будут предлагать скачать файлы с именами
12234823682373632672.7z ?
Наверное они в ужасе убегут с сайта. Да еще и другим скажут, чтобы туда не совались.
Потому что скачаешь такой файл, вернешься к папке загрузок через некоторое время и попробуй там найди то что нужно.
О юзабилити не стоит забывать.
Естественно обработку имени файла нужно производить. Русские буквы заменять на транслит, заменять пробелы .......
Но нужно сделать так, чтобы программа и работала и, пользоваться ей было удобно. | |
|
|
|
|
|
|
|
для: tihonko
(18.03.2010 в 14:12)
| | В битриксе файлы загружаются в папку, со случайным md5-хешем:
substr(md5(uniqid(mt_rand(), true)), 0, 3);
Например
/upload/iblock/a6h/some-document.doc
/upload/iblock/d49/some-document.doc | |
|
|
|
|
|
|
|
для: Саня
(18.03.2010 в 16:07)
| | т.е. каждый раз при загрузке файла на сервере создается новая папка? | |
|
|
|
|
|
|
|
для: tihonko
(18.03.2010 в 17:04)
| | Если существует, то создавать не требуется. А так да, создаётся автоматически. | |
|
|
|