ASP.NET MVC5在模型/数据库/文件夹中存储上传文件的最佳方法?

时间:2017-07-10 10:20:46

标签: asp.net file-upload asp.net-mvc-5

我正在开发MVC5项目,用户可以在其中创建订单。每个订单有2个角色。一个是客户,一个是处理器。客户可以创建订单并附加文件,处理器需要执行订单。客户文件必须对处理器可见,但处理器文件必须仅对他和其他处理器可见。但是,如果客户能够在上传部分中看到该文件,他可以在文件到文件的基础上做出决定。

现在当我开始处理文件上传时,我被告知它应该只是:客户和处理器可以上传文件,每个人都可以看到。所以我决定采用一种相当简单的方法,我根据扩展的要求/要求进行了越来越多的扩展。问题是:现在整个事情变得如此复杂,以至于我的简单方法看起来非常令人困惑,并且是一个要修改的PITA。

我的方法基本上是这样的:

  • 客户创建新订单并上传文件:上传时,文件存储在/〜/ uploads / cust / temp / {tempfolderid}中的服务器上。订单在发送之前没有id,因此我必须创建一个临时id,我将其存储在viewmodel中。此临时ID基本上基于customername + date以及创建订单的时间戳,以确保它是唯一的。发送订单时,文件将移至/〜/ uploads / cust / {orderid}。如果客户只是在不发送订单的情况下关闭浏览器,我的临时文件基本上就会混乱。要解决这个问题:每天都会删除temp文件夹中超过14天的所有文件。

  • 客户打开现有订单并上传文件:该文件存储在/~/ uploads / cust / {orderid}中。除上传文件外,客户无法对现有订单进行任何更改,这意味着没有保存按钮。因此,我不在这里使用临时文件夹,而是直接处理他的更改。

  • 客户打开现有订单并检查上传的文件:向他显示文件夹" /〜/ uploads / cust / {orderid}中的每个文件。

  • 处理器创建新订单并上传文件:(处理者可以创建自己的订单并自己附加客户 - >该流程不是由客户启动的)当他上传时文件存储在/~/ uploads / proc / temp / {temporderid}中。该订单在发送之前再次没有ID,但由于不允许客户查看处理器上传的文件,因此它们存储在不同的文件夹中。 当他点击发送时,文件被移动到"〜/ uploads / proc / {orderid}"。

  • 处理器打开现有订单并上传文件:该文件存储在" /〜/ uploads / proc / {orderid} / temp"文件夹中。当他上传一个存在于" /〜/ uploads / proc / {orderid}"文件夹已经只显示临时文件夹中的版本(订单在上传后立即更新为部分视图,无需重新加载页面),一旦保存,原始文件将被删除,新文件将从临时文件夹移至orderid文件夹。

  • 处理器打开现有订单并删除文件:每个文件旁边都有一个小x按钮。当处理器点击它时,文件被移动到" /〜/ uploads / proc / {orderid} / deleteTemp"。当他上传新文件并(保存之前)按下x按钮时,该文件将从" /〜/ uploads / proc / {orderid} / temp"中删除。文件夹再次。当他上传已存在于" /〜/ uploads / proc / {orderid}"文件夹并按下x按钮,然后将原始版本移动到deleteTemp文件夹,并从temp文件夹中删除新版本。保存更改后,deleteTemp文件夹中的每个文件都将被删除。如果他没有保存更改,则下次打开订单时,deleteTemp文件夹的内容将移回{orderid}文件夹,并删除临时文件夹的内容。

    < / LI>
  • 处理器共享文件:处理器上传的每个文件旁边都有另一个小按钮&#34;共享文件&#34;。点击它会在&#34; /〜/ uploads / proc / {orderid} / sharedFiles&#34;中创建该文件的副本。夹。该文件夹也有自己的/ temp /和/ tempDelete /文件夹,其功能与上述两个过程类似。这需要确保只有在实际保存订单时才会处理更改。

  • 客户打开现有订单并检查上传的文件(现在包含其中的共享文件):文件夹中的每个文件&#34; /〜/ uploads / cust / {orderid}&#34;并在文件夹&#34; /〜/ uploads / cust / {orderid} / sharedFiles&#34;向他展示。

现在虽然这已经相当复杂,但情况更糟:订单完成或取消后,甚至处理器也无法更改订单上的任何信息。但是,他仍然必须能够上传文件并更改共享文件许可。这类似于&#34;客户打开现有订单并上传文件&#34;但再次使用不同的方法。

还有应用程序本身创建的文件。它们存储在另一个不同的文件夹中,并且必须由处理器可见(并且可共享)。

现在我的问题是:是否有另一种更简单的方法来管理文件上传?没有千条不同的路径,没有同一个文件的多个实例,没有那么多临时文件夹?也许通过将文件链接到实际订单而不是每次只显示与订单具有相同ID的文件夹的内容?

我没有创建这个项目,我不确定为什么他们最初没有包含文件上传。我刚接受了这个项目并被告知要实现更多功能。

编辑:添加了一个想法作为答案。

1 个答案:

答案 0 :(得分:0)

我有个主意:

我创建了一个名为uploadedFiles的新模型,其中包含以下值:

AuftragsID | FileID |档案| isShared | UploadedByRole

我将此添加到ViewModel:

 public IEnumerable<uploadedFiles> myUploadedFiles { get; set; }

在删除,覆盖和共享时,我只需更新ViewModel,当用户点击save时,我将更改写入数据库。

为此,我必须能够将文件保存到我的数据库中。这可能吗?