Является ли хорошей идеей использовать GUID в именах файлов, создаваемых пользователями? - PullRequest
4 голосов
/ 02 октября 2011

Я создаю приложение (CMS), где пользователь может загружать файлы, например изображения.

У меня вопрос, как переименовать эти файлы для сохранения.

Я думаю, лучше всего сгенерировать GUID (System.GUID.NewGuid()) для сохранения файла. Я прав или существует лучший подход в этом случае?

Примечание: Пример сгенерированного GUID: 7c9e6679-944b-7425-40from-e07fc1f90ae7 . В этом случае файл изображения будет иметь вид: 7c9e6679-944b-7425-40from-e07fc1f90ae7.jpg

Обновление:

Пользователи не будут взаимодействовать напрямую с именем файла.

Ответы [ 5 ]

5 голосов
/ 02 октября 2011

Да. Но, вероятно, гораздо более удобная схема будет использовать хэш-сумму (скажем, MD5-сумму) содержимого.

Таким образом,

  • генерация имени файла повторяется (в случае, если что-то идет не так, данные необходимо перенести на другой сервер, контент распределяется между различными установками и т. Д.).
  • вы автоматически поделитесь повторными загрузками. Конечно, тогда вам нужно будет отследить, кому принадлежит файл (и не удалять его, пока не будет удалено последнее использование)

Примечание Пример типичной суммы md5: 5eb63bbbe01eeed093cb22bb8f5acdc3 (для ASCII / UTF8 "hello world")

Редактировать в ответ на комментарии (о хеш-коллизиях): Достаточно верно, что вы можете получить хеш-коллизии с очень большими наборами документов. В этом случае чаще всего используется хэш-сумма + длина файла для идентификации «содержимого blob». Так что вы бы сделали что-то вроде:

 http://cms.mysite.local/docs/123986/5e/b63bbbe/01eeed093cb22bb8f5acdc3.png

для png длины ~ 123Kb

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

Если вы хотите улучшить SEO, вы должны добавить что-то перед GUID.Лучше создать свой собственный уникальный идентификатор в сочетании с чем-то, что объясняет изображение / файл (из-за SEO).

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

Itemid-ItemName.jpg

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

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

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

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

Обычно я сначала сохраняю загруженный файл во временный файл с помощью Path.GetTempFileName, а затем перемещаю его в постоянное хранилище с соответствующим именем после того, как пройдены все проверки.

См .:

http://msdn.microsoft.com/en-us/library/system.io.path.gettempfilename%28v=vs.80%29.aspx

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

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

Да, такой подход хорош.Это очень похоже на то, как Git хранит свои файлы.Если вы делаете то же самое, что и Линус Торвальдс, вы, вероятно, делаете это правильно.

...