Как связать файлы с записями, которые еще не были сохранены - PullRequest
1 голос
/ 21 января 2011

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

Я хочу, чтобы это работало так же, как сообщения на форуме в веб-почте или phpBB.Вы начинаете новое сообщение.Там есть элемент ввода загрузки файла, рядом с которым находится кнопка «Добавить».Когда вы добавляете файл, он загружается, и вы можете продолжить писать свое сообщение.Когда вы, наконец, нажимаете «отправить», он создает заметку и связывает с ней загруженные файлы.Вот несколько иллюстраций ASCII:

Subject:     ______________

Message:     ______________
             ______________
             ______________

Attachments: some_file.txt
             resume.odt
             ______________ [Browse][Add]

             [Save]

Но как я могу связать загрузки с заметкой, когда она все еще пишется?Это еще не было сохранено.У него нет идентификатора.Обычно я бы добавил таблицу базы данных, которая связывает загруженные файлы с идентификаторами заметок, но это не работает для заметки, которая еще не была сохранена.Что меня беспокоит, так это то, что когда пользователь начинает писать новую заметку, добавляет в нее файл, а затем передумает, никогда не сохраняя заметку (например, закрывая браузер).Я не хочу, чтобы эти загруженные файлы задерживались.

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 21 января 2011

Хорошо, поэтому он открывает этот URL, где он видит макет, который вам удалось нарисовать (слава ASCII-искусству). Перед рендерингом страницы вы создали пустую запись заметки, которая предоставит вам идентификатор. Он загружает файлы (которые идут куда-то на жесткий диск, и вы сохраняете только пути в другой таблице базы данных, помните, что отношение файл-примечание много-к-одному), вуаля! У вас уже есть идентификатор, чтобы связываться с ними! Что касается потерянных файлов с оставленной запиской. Ну, есть несколько вариантов, чтобы справиться с этим, но все они заканчиваются тем, что в вашем веб-приложении есть еще одна глава, называемая «техническое обслуживание». Я бы сохранил идентификатор последней заметки в профиле пользователя и не позволил бы ему создать новую заметку без сохранения или удаления предыдущей.

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

В дни, предшествующие AJAX, если вы хотите прикрепить файл к форме, вы просто загрузите файл во время отправки формы.Теперь у нас есть все виды умных способов передачи файлов, или, по крайней мере, два или три популярных способа, некоторые из которых используют Flash или jQuery.Но вы заметили главную проблему обслуживания с этими методами: всякий раз, когда пользователь загружает изображение параллельно с заполнением формы, нет никакой гарантии, что форма будет когда-либо отправлена.Вы должны придумать какой-то механизм тайм-аута для этих загруженных файлов, и это, как правило, означает запуск какого-то процесса обслуживания.Вы можете добавить еще одну движущуюся часть в свою архитектуру, и вам нужно будет периодически отслеживать ее, чтобы убедиться, что вещи не выходят из-под контроля.

В зависимости от ожидаемой частоты и объема трафика, вам нужноопределить некоторые параметры, когда потерянные файлы могут быть удалены.Если вы ожидаете менее 100 загрузок в день, то ежедневные чистки должны быть в порядке.При каждой очистке вы хотите удалить любой файл, который был потерян в течение определенного периода времени.Для этого вам понадобится механизм идентификации старых файлов, и хотя вы сможете сравнить файлы с записями в таблице, для этого потребуются дополнительные ресурсы базы данных, которые могут повлиять на скорость вашего сайта.Это намек на то, что вы должны перемещать эти файлы в другое место после их обработки, чтобы упростить идентификацию потенциальных сирот.

Теперь, контролируя этот процесс, вы можете решить, нужно ли ему запускать больше илименее часто.Если вы приняли плохое дизайнерское решение, уборка будет более болезненной, особенно если она выполняется ежечасно или чаще.

Удачи!

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

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

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

...