Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Загрузка файла на сервер - защита от перезаписи существующих файлов
 
 автор: tihonko   (18.03.2010 в 14:12)   письмо автору
 
 

Добрый день!
При разработке приложений, с помощью которых администратор сайта может загружать собственные файлы на сервер, возникает задача: как защитить уже существующие файлы от перезаписи новыми в случаи совпадения имен?
Сейчас я решаю этот вопрос добавлением уникального префикса ко всем загружаемым файлам. А в качестве префикса использую результат, возвращаемый функцией time().
Но в этом случаи первоначальное имя файла достаточно сильно искажается и визуально его прочесть тяжеловато. Поэтому это не очень удобно посетителям сайта, которые загружают файлы с сайта(по названию становится трудно определить что же находится в файле).

Скажите, кто как решает эту задачу?

  Ответить  
 
 автор: sim5   (18.03.2010 в 14:35)   письмо автору
 
   для: tihonko   (18.03.2010 в 14:12)
 

Ссылки на файлы в базе есть? Там же можно хранить и оригинальное имя файла.

  Ответить  
 
 автор: tihonko   (18.03.2010 в 15:31)   письмо автору
 
   для: sim5   (18.03.2010 в 14:35)
 

Спасибо, хорошая идея! В этом случаи мы видимое на странице имя файла(которое является ссылкой на сам файл) улучшим.
Но если посетитель сайта кликнет по ссылке, которая ведет на сам файл, то браузер в диалоговом окне предложит загрузить или открыть эту абру-кадабру)

  Ответить  
 
 автор: sim5   (19.03.2010 в 04:02)   письмо автору
 
   для: tihonko   (18.03.2010 в 15:31)
 

А вы файлы как отдаете, посредством скрипта? И какая тогда проблема указать реальное имя файла, под которым его и скачает клиент? И пользователь в диалоге не аброкадабру увидит, а нормальное имя, причем не надо никаких транслитов идиотских.

P.S. Кстати, одно и тоже имя, это надо просто исключать. Что могут говорить пользователю ссылки на файлы с одинаковыми именами?

  Ответить  
 
 автор: tihonko   (19.03.2010 в 07:19)   письмо автору
 
   для: sim5   (19.03.2010 в 04:02)
 

Я разрабатываю класс, который будет использоваться в CMS для загрузки файлов. В последующем администратор сайта сможет выкладывать ссылки на произвольных страницах сайта на эти файлы. Задача - сделать так, чтобы при загрузки 2 файлов с одинаковыми именами это не привело к перезаписи одного из них другим и чтобы исходное имя файла, после сохранения его на сервере, не слишком искажалось.

Если сохранять оригинальное имя файла в базе как вы предложили, то его можно использовать в качестве ссылки в последующем. Согласен, это хорошая идея. Но помимо этого нужно также устранить коверканье имени файла после его загрузки. Т.е. чтобы он на сервере тоже назывался понятным образом)

  Ответить  
 
 автор: sim5   (19.03.2010 в 07:32)   письмо автору
 
   для: tihonko   (19.03.2010 в 07:19)
 

Имя файлу под которым он будет лежать на диске, можно давать какое угодно. Хотите париться с одинаковыми, резмещайте их в разные каталоги. Я вам ведь не об этом говорю, а об истинном имени. У вас на диске может быть файл 1.txt, а реально он будет называться "Мама мыла раму", но если еще кто-то захочет написать об этом, то согласитесь, что первый должен тогда быть, например, как "Мама мыла раму (классическое из Азбуки)", а второй "Мама мыла раму (взгляд прохожего)", и лежать под именем хоть 123.txt.
Как пользователю принимать решение о том, одинаковы ли по содержанию эти файлы? Ну сохраните вы их под одинаковыми именами, заботясь о своем благе, а об удобстве пользователя забыли?
Классы, CMS..., это рояли не играет, достаточно администратору указать, что такое имя файла уже есть, даже дать ему почитать анонс его, это не так трудно, и руки у него не отвалятся дать имя отличное или добавить к нему нечто для отличия, а физическое имя файлу автоматом, без его участия.

  Ответить  
 
 автор: tihonko   (19.03.2010 в 09:17)   письмо автору
 
   для: sim5   (19.03.2010 в 07:32)
 

Истинные имена будут удобны для пользователей. Об этом позабочусь!

  Ответить  
 
 автор: Лена   (18.03.2010 в 14:43)   письмо автору
 
   для: tihonko   (18.03.2010 в 14:12)
 

А если в конец названия поставить переменную счетчика?
file_1, file_2, file_3 и проверять, если есть такой файл, то счетчик увеличивается на единицу.
Чисел все-таки будет меньше, чем c time();

  Ответить  
 
 автор: tihonko   (18.03.2010 в 15:33)   письмо автору
 
   для: Лена   (18.03.2010 в 14:43)
 

Отличная идея, спасибо!

  Ответить  
 
 автор: tihonko   (18.03.2010 в 15:39)   письмо автору
 
   для: tihonko   (18.03.2010 в 15:33)
 

sim5, Лена
Синтезируя обе ваши идеи задача прекрасно решается!
Да здравствует коллективный разум!

  Ответить  
 
 автор: Valick   (18.03.2010 в 16:33)   письмо автору
 
   для: tihonko   (18.03.2010 в 15:39)
 

Позвольте Вам процитировать самого себя:
у Вас было бы меньше геморроя если бы имя хранимого файла было бы не Rock n' Roll.7z, а идентификатор строки БД соответствующий этому названию т.е. 56743.7z
к тому же я не знаю как эти архивы попадают к Вам и кто следит за одинаковыми именами файлов, а при использовании варианта с идентификатором про уникальность можно не думать в пределах разумного...

отвечал вчера в соседней ветке, но думаю проблема будет жить вечно... книжки-то просто так печатают... кому они нужны читать их ещё

  Ответить  
 
 автор: tihonko   (18.03.2010 в 17:02)   письмо автору
 
   для: Valick   (18.03.2010 в 16:33)
 

>отвечал вчера в соседней ветке, но думаю проблема будет жить вечно... книжки-то просто так печатают... кому они нужны читать их ещё

Похоже что действительно зря. По крайней мере по юзабилити. Кому они нужны-то. Читать их еще......
Что интересно будет, если пользователям будут предлагать скачать файлы с именами
12234823682373632672.7z ?

Наверное они в ужасе убегут с сайта. Да еще и другим скажут, чтобы туда не совались.
Потому что скачаешь такой файл, вернешься к папке загрузок через некоторое время и попробуй там найди то что нужно.

О юзабилити не стоит забывать.

Естественно обработку имени файла нужно производить. Русские буквы заменять на транслит, заменять пробелы .......

Но нужно сделать так, чтобы программа и работала и, пользоваться ей было удобно.

  Ответить  
 
 автор: Саня   (18.03.2010 в 16:07)   письмо автору
 
   для: 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

  Ответить  
 
 автор: tihonko   (18.03.2010 в 17:04)   письмо автору
 
   для: Саня   (18.03.2010 в 16:07)
 

т.е. каждый раз при загрузке файла на сервере создается новая папка?

  Ответить  
 
 автор: Саня   (18.03.2010 в 18:39)   письмо автору
 
   для: tihonko   (18.03.2010 в 17:04)
 

Если существует, то создавать не требуется. А так да, создаётся автоматически.

  Ответить  
 
 автор: Natali1   (30.11.2016 в 23:53)   письмо автору
 
   для: Саня   (18.03.2010 в 18:39)
 

Использую Total Commander, только для защищенного соединения создаю защищенное соединение FTPS

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования