Как вы справляетесь с временными загрузками изображений в PHP? - PullRequest
3 голосов
/ 15 сентября 2009

Я создаю онлайн-игру на PHP, где пользователи могут создавать игровых персонажей. Каждый персонаж может иметь загруженный пользователем портрет. Игрок может одновременно иметь несколько персонажей, и картинки для них можно менять в любое время. Естественно, изображения должны быть изменены и повторно сжаты, чтобы избежать огромных файлов. Вот моя проблема:

Когда игрок изменяет свои данные (среди них изображение), а затем нажимает «сохранить», начинается проверка на стороне сервера. Он проверяет такие вещи, как неуникальные имена персонажей, пустые обязательные поля и т. Д. найдено, они отображаются. В этом случае форма должна быть предварительно заполнена данными, введенными игроком, поэтому ему нужно только изменить ошибочный бит, а не вводить все заново. Но как сохранить картинку в таком «временном» состоянии?

Я не могу предварительно заполнить поле загрузки файла, браузеры не позволяют этого. Если я сохраню его во временном файле, картинка должна быть очищена в какой-то момент, потому что проигрыватель может просто закрыть свой браузер и прервать весь процесс. Когда это должно быть? И какое имя файла мне выбрать для временного файла? Если игрок открывает один и тот же персонаж для редактирования на двух вкладках браузера, они не должны конфликтовать (каждая из них должна иметь свою собственную копию).

Как бы вы решили эту проблему?

Ответы [ 4 ]

10 голосов
/ 15 сентября 2009

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

Если вы не можете запустить задание cron, вы всегда можете просто запустить очистку каталога при каждой успешной проверке создания / обновления. Это может быть немного более неэффективно (дополнительное чтение каталога и, возможно, файловые операции для каждой успешной отправки), но если вы не имеете дело с большим объемом трафика, вы, вероятно, даже не заметите.

0 голосов
/ 15 сентября 2009

Я бы порекомендовал либо обновить изображение немедленно, независимо от ошибки в форме, либо разделить обновление изображения на отдельную форму. Таким образом вы избавитесь от двух проблем без сложных конечных автоматов и очистки.

0 голосов
/ 15 сентября 2009

Вы всегда можете заполнить отключенное текстовое поле для хранения имени картинки - оно не будет заполнять поле ввода обзора, но лучше, чем ничего. Для редактирования, чтобы избежать конфликтов, вы можете создать столбец «модификации» для символов каждого пользователя, а в запросе на редактирование символов изменить значение на true. Когда пользователь сохранит символ, установите для него значение false. Для каждого запроса на редактирование предоставляйте его только в том случае, если «изменение» имеет значение false.

0 голосов
/ 15 сентября 2009

Создать таблицу для хранения ссылок на изображения.

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

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

Когда вы наконец примете новый символьный объект, установите avatar_id или любой другой.

Запустите обычное cron-задание для отбраковки потерянных изображений (также удалив файлы на диске).

...