PHP: загрузка изображения при создании новой записи - PullRequest
6 голосов
/ 31 января 2011


Это скорее концептуальный вопрос , а не о базовой технике программирования.

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

Поскольку идентификатор записи еще не доступен, невозможно связать это конкретное изображение с записью в БД, пока я не нажму кнопку Сохранить .

Теперь предположим, что после загрузки изображения я ухожу от экрана «Добавить запись», оставляя потерянный файл изображения на сервере.

Я могу вернуться к экрану «Добавить запись» и продолжать делать это снова и снова ... и съесть значительную часть пространства сервера с несвязанными / неиспользуемыми изображениями.

Как бы вырешить эту проблему?Какой поток логики здесь следует применять?

Один из вариантов (с которым я сейчас экспериментирую) - это сохранять загруженные изображения в папке tmp , перемещать их и помещатьПосле того, как запись будет создана, поместите их в другую нужную папку (со ссылкой на изображение в месте последнего упокоения).А затем запускайте ночные задания cron, чтобы удалить остатки из папки tmp.

Есть ли другие более яркие и элегантные подходы к этому?

Спасибо,
m ^ e

Ответы [ 3 ]

3 голосов
/ 12 марта 2011

Вроде старый вопрос, так что вы, наверное, поняли это, но вот как я обхожу это вопрос:

  1. Создайте поле в вашей базе данных с именем ImgGuid со значением по умолчанию 0 (varchar) для идентификации изображения. Я обычно просто использую Guid с или без расширения изображения. Пути могут быть настроены в другом месте.
  2. Создайте скрытое поле на странице загрузки с именем hfImgGuid (или чем-либо еще) и загрузите значение ImgGuid из базы данных, если нет записи, значение должно быть 0
  3. Теперь в вашем обработчике загрузки проверьте, значение равно 0, если это так, создайте новый Направьте изображение и верните его ваш swfupload и установите ваш hfImgGuid с этим значением. Также сохраните Guid в пользовательской сессии.
  4. Когда пользователь нажимает «Сохранить», значение hfImgGuid будет сохранено в поле «ImgGuid» и ваше изображение будет связано с записью. Когда пользователь хочет изменить свою фотографию позже, вы можете просто перезаписать текущее изображение (или создать новый Guid и удалить старый, но для этого примера это проще)
  5. Единственная проблема, которую мы получили, заключается в том, что когда пользователь создает «Новую запись» и загружает фотографию, а затем решает покинуть страницу, вы обнаружите, что у вас есть изображение-орфанист. Итак, здесь начинается пользовательская сессия. Когда пользователь сохраняет страницу, вы можете удалить изображение из сеанса, если пользователь не сохраняет его и сеанс заканчивается, вы можете прочитать значения и удалить изображения-слоны.

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

1 голос
/ 31 января 2011

Вы можете устранить хотя бы часть проблемы, сохранив пути ко всем загруженным элементам в файле cookie (или файлах cookie, если используются разные браузеры) на клиентском компьютере.

альтернативно, не используйте SWFUpload,используйте обычный старый HTML-файл «input type = file» upload и принудительно создайте запись перед добавлением связанной фотографии.это, возможно, было бы самым чистым решением потенциально грязной проблемы.

0 голосов
/ 31 января 2011

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

...