文件上传作为原子操作

时间:2013-08-06 15:53:12

标签: c# asp.net-mvc-3 azure-storage-blobs

我目前正在使用mvc 3和c#开发应用程序。我需要实现一个文件上传控制器。我有一个db表,用于存储文件元数据,名称,大小,类型,文件路径,目的等。我想将实际文件存储为windows azure服务器上的blob,并使用db行作为指向它的指针。

我想保存连接到文件的项目,例如Person Profile(目的),然后在我获取配置文件的主键后执行上传,这样我就可以进行必要的关联,然后上传文件并保存文件的元数据。

如果用户在按下按钮以保存个人资料页面之前可以选择该文件,我该怎么做这个原子。

在完成剩余步骤之前,似乎我必须以某种方式将文件写入会话变量或将文件写入某个临时文件夹(暂存)。有没有更好的方法来执行这些可以保证原子性的步骤?

3 个答案:

答案 0 :(得分:5)

恕我直言,问题在于架构师认为这个过程是一个原子操作,而用户体验则会另有说法。你现在正处于冲突的中间。 =)

您可以保证两个不同进程的原子性,以及后处理的数据统一性。让我做一些猜测,并假设你正在为当前(交互式)用户实现一个配置文件创建过程。

  • 允许用户上传图片;将其提交到您的存储,将其标记为事务性,将SessionID元数据添加到它。

  • 用户完成创建他/她的个人资料后,扫描您的存储空间以查找具有相同SessionID的图片。将两者绑定在一起(例如,将文件ID与配置文件ID相关联。)更复杂的过程将包括,例如,“配置文件创建”cookie,其中包含应该存储的独占ID - 因此,如果用户放弃该会话,稍后返回上传的文件仍然可以使用。

  • 实施'垃圾收集器'。在达到阈值(时间或其他)后处理未使用的文件。

我知道这些建议并不完全涵盖您的原始请求,但它们可能有助于简化您的实施。

答案 1 :(得分:1)

您使用的数据库是什么?您可以通过使用SQLTransaction Class包装插入以获取try / catch中的主键来开始制作此原子,并使用SqlTransaction.Rollback MethodSqlTransaction.Commit Method's来撤消插入(如果有的话)文件传输

捕获异常
try
{
 // conn.BeginTransaction();
 // Insert
 // File Transfer
 // Catch Exceptions
 // transaction.Commit();
}
catch (Exception ex)
{
  // Roll back Insert if file transfer fails
  // transaction.Rollback();
}

答案 2 :(得分:0)

目前还不清楚你遇到麻烦的问题。

如果您将一个html multipart/form-data表单发布到控制器,则该文件将作为一个请求与其余数据一起发布。当您准备对文件的数据执行某些操作时,您只需访问我认为您已在某处自动绑定的HttpPostedFileBase InpustStream属性。无需保存临时文件,IIS已经为您完成了这项工作。

另一方面,如果您希望确保在任何数据上传之前创建配置文件,那么您需要使用单独的HTTP请求处理该配置文件(但这是相反的)一个原子操作,所以我认为这不是你需要的。)

如果您想要的是处理文件成功上传但服务器检测到表单其他部分出现问题的情况,并且您不希望用户必须等待文件再次上传,是的,你会希望在某个临时的地方保存对文件的引用,这样它就不会在请求之间丢失(比如会话变量或写回到表单上的隐藏字段)。