Вы можете использовать таблицу изображений, например:
id: int
filename: varchar
hash: varchar
format: enum('jpeg', 'png')
Хеш может быть чем-то вроде sha1_file($uploaded_file)
и используется для того, чтобы убедиться, что дублирующиеся изображения не загружены.(Таким образом, вы можете иметь несколько записей в таблице изображений с одним и тем же хешем, если хотите.) Идентификатор полезен, так что вы можете иметь целочисленные ссылки на внешние ключи обратно на таблицу изображений.
Затем сохраните изображения вЛибо:
/image/$id.$format
или
/image/$hash.$format
Второй формат с помощью хэша позволит избежать дублирования данных изображения.Если вы имеете дело с большим количеством изображений, вы можете сделать что-то вроде:
/image/a/b/c/abcdef12345.jpg
, где вы используете несколько слоев папок для хранения изображений.Многие файловые системы замедляются из-за слишком большого количества файлов в одном каталоге.
Теперь вы можете напрямую ссылаться на эти файлы или настроить URL-адрес, например:
/image/$id/$filename
Например:
/image/12347/foo.jpg
foo.jpg
происходит от того, что пользователь загрузил.Это на самом деле игнорируется, потому что вы смотрите через идентификатор.Тем не менее, изображение получит хорошее имя, если человек решит его скачать.(При желании вы можете проверить, что имя файла изображения совпадает после поиска идентификатора.)
Приведенный выше путь может быть переведен в image.php через Apache MultiView или ModRewrite.Затем вы можете readfile()
или использовать X-SendFile (более высокая производительность, но не всегда доступная), чтобы отправить файл пользователю.
Обратите внимание, что если у вас нет X-SendFile и вы не хотитечтобы обрабатывать вещи через PHP, вы можете использовать RewriteRule для преобразования /image/$hash/foo.jpg
в /image/a/b/c/$hash.jpg
.