是否可以在TempData中存储二进制数据?

时间:2011-08-04 15:10:30

标签: c# jquery asp.net-mvc-3 session

我在想。如果我的表单分为允许用户上传各种文件的步骤,我可以将这些文件作为二进制数据保存在TempData中吗?

我需要能够将文件保存到磁盘,并将其保存到数据库中。

我有一个用于ViewModel的index.cshtml,在每个帖子上显示一个类型为IStepViewModel的ViewModel属性的编辑器。因此每一步代表要收集的总数据的一部分。

通过这种方式,我可以管理1个index.cshtml页面,并按照我想要的步骤进行操作。

客户需要一些步骤来允许上传,而其他人则不需要。他们还希望上传是Ajaxy,这意味着在步骤可能不完整时发布。

我希望能够在最后的审核步骤中,让他们知道您正在考虑上传的文件......直到他们点击最终的TRANSMIT文件在TempData中,这种方式我认为我可以进行一次原子操作。

操作将是   - 将所有表单数据再次保存到DB
  - 使用transmitted的位标记标记数据库记录   - 将文件保存到我们的服务器上

也许我应该采取完全不同的方法......如果是这样,请告诉我。

2 个答案:

答案 0 :(得分:1)

TempData存储在会话中,但只会存储到下一个请求,因此很有可能会丢失您存储在那里的任何内容。这不是打算使用的方式。

从您的用户的角度来看,他们的操作的原子性并不像几乎一样重要,因为他们确保数据不会意外丢失。作为用户,当我必须查找大量信息以填写表单时,我讨厌它,然后在我点击“完成”之前发现我的会话超时。

我建议你模拟用户在数据存储中进行的进度(在这种情况下可能是数据库和文件存储的组合)。让用户上传文件,并将文件保存到特定位置。使数据库具有表示其填写的各种表单数据的模型,并引用用户已上载的文件。当用户完成最后一步时,您可以在数据库中将向导标记为“完成”,这样就完成了到目前为止所做的所有事情。

您可以决定是否希望用户在一段时间内处于非活动状态后能够“继续”向导,或者您是否希望制定一个策略,告知用户之后任何向导不完整的向导会话结束可以免费删除。

更新

我没有意识到TempData的行为发生了变化,但是现在项目一直存在,直到它们从TempData读出,或者直到会话到期为止。这使得数据的波动性比以前略有下降,但是保留用户花费时间输入和上传的数据仍然是一个危险的地方。

答案 1 :(得分:1)

TempData使用会话存储来存储数据,因此任何可以序列化的东西都可以保存在那里。

但是,在您的情况下,保存会话存储中的文件可能不是一个好主意,因为您可以轻松地耗尽内存。

解决方案将用于基于临时文件的存储(您甚至可以实现temp db/file based session store

  • 当用户上传文件时,文件将写入服务器上的临时文件夹(如果您的应用程序是基于Web服务器的,则可以是集中文件夹)。
  • 指向临时文件夹的指针存储在TempData中。
  • 成功完成向导过程后,可以将这些文件移动到DB和永久文件服务器。
  • 您的应用可以决定清除临时文件,或者夜间作业可以清除这些文件。

这样可以避免多次访问DB和DB上不必要的I / O.

您还可以将SQL Server作为会话的后备存储或其他持久保存临时数据的数据库(oracle)。这样,您的应用就可以处理TempData,并且不知道临时文件的存储方式。