Можно ли хранить двоичные данные в TempData? - PullRequest
0 голосов
/ 04 августа 2011

Мне интересно.Если у меня есть форма, которая разбита на этапы, позволяющие пользователям загружать различные файлы, могу ли я сохранить эти файлы в TempData как двоичные данные?

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

У меня есть один index.cshtml для ViewModel, который в каждом сообщении отображает редактор для свойства ViewModel, имеющего тип IStepViewModel Так что каждый шаг представляет собойчасть общих данных, которые необходимо собрать.

Таким образом, у меня может быть 1 страница index.cshtml для управления и столько шагов, сколько мне нужно.

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

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

Операция будет
- Сохранить все данные формы еще раз в БД
- Пометить запись базы данных битовым флагом transmitted
- Сохраните файлы на нашем сервере

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

Ответы [ 2 ]

1 голос
/ 08 августа 2011

TempData использует хранилище сеансов для хранения данных, поэтому все, что можно сериализовать, может быть сохранено там.

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

В качестве решения будет использоваться хранилище на основе временных файлов (вы даже можете реализовать хранилище сеансов на основе temp в дБ / файлах .

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

Это позволит избежать многократных обращений к БД и ненужного ввода-вывода в БД.

Вы также можете сделать SQL Server в качестве резервного хранилища вашего сеанса или некоторых других.другая БД ( oracle ), которая сохраняет временные данные.Таким образом, ваше приложение работает с TempData и не зависит от того, как хранятся временные файлы.

1 голос
/ 04 августа 2011

TempData сохраняется в сеансе , но только до следующего запроса , поэтому высока вероятность потери всего, что вы там храните.Это не тот способ, которым предполагалось его использовать.

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

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

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

Обновление

Я не осознавал, что поведение TempData изменилось, но элементы теперь сохраняются там до тех пор, пока они не будут считаны из TempData или до истечения сеанса.Это делает данные немного менее изменчивыми, чем раньше, но это все еще опасное место для хранения данных, которые ваши пользователи потратили время на ввод и загрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...