提问人:AbcUser123 提问时间:7/10/2017 最后编辑:AbcUser123 更新时间:7/10/2017 访问量:390
ASP.NET MVC5 将上传的文件存储在模型/数据库/文件夹中的最佳方式?
ASP.NET MVC5 Best way to store uploaded files in Model/DB/Folders?
问:
我正在开发一个 MVC5 项目,用户可以在其中创建订单。每个订单有 2 个角色。一个是客户,一个是处理器。客户可以创建订单并附加文件,处理器需要这些文件来执行订单。客户文件必须对处理器可见,但处理器文件必须仅对他和其他处理器可见。但是,如果客户能够在上传部分看到文件,他可以基于文件到文件来决定文件。
现在,当我开始进行文件上传时,我被告知应该只是这样:客户和处理者可以上传文件,每个人都可以看到。因此,我决定采用一种相当简单的方法,并根据扩展的需求/需求越来越多地扩展该方法。问题是:现在整个事情变得如此复杂,以至于我的简单方法似乎非常令人困惑,并且需要修改 PITA。
我的方法基本上是这样的:
客户创建新订单并上传文件:上传后,文件存储在服务器上的 /~/uploads/cust/temp/{tempfolderid} 中。订单在发送之前没有 id,因此我必须创建一个临时 id,并将其存储在 viewmodel 中。这个临时 ID 基本上是基于 customername+date 和创建订单的时间戳,以确保它是唯一的。发送订单后,文件将移动到 /~/uploads/cust/{orderid}。如果客户只是关闭浏览器而不发送订单,那么我的临时文件基本上就堆满了临时文件。为了解决这个问题:每天删除临时文件夹中超过 14 天的所有文件。
客户打开现有订单并上传文件:该文件存储在 /~/uploads/cust/{orderid} 中。除了上传文件外,客户无法对现有订单进行任何更改,这意味着没有保存按钮。因此,我在这里不使用临时文件夹,而只是直接处理他的更改。
客户打开现有订单并检查上传的文件:文件夹“/~/uploads/cust/{orderid}”中的每个文件都会显示给他。
处理者创建一个新订单并上传一个文件:(处理者可以创建自己的订单并自己将客户附加到该订单上 - >该过程不仅仅是由客户启动的)当他上传文件时,它存储在 /~/uploads/proc/temp/{temporderid} 中。订单在发送之前再次没有 ID,但由于不允许客户查看处理器上传的文件,因此它们存储在不同的文件夹中。 当他单击发送时,文件将移动到“~/uploads/proc/{orderid}”。
处理者打开现有订单并上传文件:该文件存储在文件夹“/~/uploads/proc/{orderid}/temp”中。当他上传一个已经存在于 “/~/uploads/proc/{orderid}” 文件夹中的文件时,只会向他显示 temp 文件夹中的版本(订单在上传后立即以 partialviews 更新,无需重新加载页面),一旦他保存,原始文件将被删除,新文件将从 temp 文件夹移动到 orderid 文件夹。
处理器打开现有订单并删除文件:每个文件旁边都有一个小 x 按钮。当处理器单击它时,文件将移动到“/~/uploads/proc/{orderid}/deleteTemp”。当他上传一个新文件并(在保存之前)按下 x 按钮时,该文件将再次从 “/~/uploads/proc/{orderid}/temp” 文件夹中删除。当他上传一个已经存在于“/~/uploads/proc/{orderid}”文件夹中的文件并按下 x 按钮时,原始版本将移动到 deleteTemp 文件夹,新版本将从临时文件夹中删除。保存更改后,deleteTemp 文件夹中的每个文件都将被删除。如果他不保存更改,则下次打开订单时,deleteTemp 文件夹的内容将移回 {orderid} 文件夹,并删除临时文件夹的内容。
处理器共享文件:处理器上传的每个文件旁边都有一个小按钮“共享文件”。单击后,它会在“/~/uploads/proc/{orderid}/sharedFiles”文件夹中创建文件的副本。此文件夹也有自己的 /temp/ 和 /tempDelete/ 文件夹,其功能与上述两个进程中的文件夹类似。这是为了确保仅在实际保存订单时才处理更改。
客户打开现有订单并检查上传的文件(现在其中有共享文件):文件夹“/~/uploads/cust/{orderid}”和文件夹“/~/uploads/cust/{orderid}/sharedFiles”中的每个文件都会显示给他。
现在,虽然这已经相当复杂,但情况变得更糟:一旦订单完成或取消,即使是处理器也无法更改订单上的任何信息。但是,他仍然必须能够上传文件和更改共享文件许可。这类似于“客户打开现有订单并上传文件”,但同样使用不同的方法。
还有一些文件是应用程序本身创建的。它们存储在另一个不同的文件夹中,并且必须由处理器可见(和共享)。
现在我的问题是:有没有另一种更简单的方法来管理文件上传?没有一千个不同的路径,没有同一文件的多个实例,也没有这么多临时文件夹?也许通过将文件链接到实际订单,而不是每次都只显示与订单具有相同 ID 的文件夹的内容?
我没有创建这个项目,我不确定为什么他们最初没有包含文件上传。我刚刚接受了这个项目,并被告知要实现更多功能。
编辑:添加了一个想法作为答案。
答:
我有个主意:
我创建了一个名为 uploadedFiles 的新模型,其值如下:
AuftragsID |文件ID |文件 |是共享的 |UploadedBy角色
我将其添加到 ViewModel:
public IEnumerable<uploadedFiles> myUploadedFiles { get; set; }
在删除、覆盖和共享时,我只需更新 ViewModel,当用户单击保存时,我会将更改写入数据库。
为此,我必须能够将文件保存到我的数据库中。这可能吗?
评论