Генерация случайного значения каждый раз для моего сайта - PullRequest
0 голосов
/ 29 октября 2011

Я загружаю файлы на сайт нашей компании, используя CGI.В административной панели сотрудники могут загружать изображения, соответствующие определенному объекту, который впоследствии сохраняется в JSON.Все это работает, но если Сотрудник A загружает dog.png, а затем Сотрудник B загружает dog.png.Изображение сотрудника B будет иметь приоритет над изображением сотрудника A, и оба будут ссылаться на одно и то же изображение.Я думал о том, чтобы получить хэш изображения и назвать его собственным хэшем, проблема в том, что чтение файла перед загрузкой немного схематично с поддержкой браузера (проблемы безопасности) и его сохранение на сервере, получение хэша, повторное сохранениеи затем удаление старого файла происходит медленно и взломано.

Мой вопрос

Учитывая это, как лучше всего дать каждому файлу уникальное имя?Имя файла не имеет значения, если оно соответствует соглашениям о сохранении (т. Е. Не / или .).Я также должен иметь возможность сгенерировать имя до загрузки файла.

То, что я сейчас использую

  • JQuery
  • Javascript
  • CGI (Python)

Ответы [ 4 ]

2 голосов
/ 29 октября 2011

Для генерации случайных имен на клиенте в Javascript:

Math.random().toString(16).replace(/\./, '')

Для выполнения этого в PHP на сервере:

mt_rand()
1 голос
/ 29 октября 2011

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

Каждый продукт имеет свою собственную папку, которая является идентификатором продукта в базе данных, но это на самом деле не имеет значения.

Изображениям присваиваются имена, поскольку они загружаются просто вформат

itemID-TimeAsUnix.jpg

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

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

1 голос
/ 29 октября 2011

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

Я не понимаю, почему вы должны сгенерировать имя до того, как оно будет загружено, и оно не соответствует тексту вашего вопроса, потому что вы не будете знать имя загруженного файла ("dog.png" в ваш пример), пока он не будет загружен, поэтому нет опасности столкновения имен, если вы не выбрали одно и то же имя дважды.

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

0 голосов
/ 29 октября 2011

Может быть, создать гид в javascript.Тогда у вас будет уникальный идентификатор для загруженного файла.

От более старого SO вопрос здесь

function S4() {
   return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
function guid() {
   return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}
...