如何使用C#MVC在控制器之间保存文件?
我问了之前的一个问题,其中一个问题本身似乎是一个完整的主题 我正试图跨控制器调用保留一个文件数据 场景是:用户上传一个包含要提交到数据库的条目的文件。如果文件有警告和错误,它们将被重定向到验证页面。如果没有警告或错误,将直接处理其文件 如果用户收到警告但没有错误(即文本字段太长,将被截断),他们仍然可以导入文件。由于上传文件和将文件发送到数据库之间有两个单独的屏幕,因此需要保留文件数据 我见过十几个与此类似的问题,但似乎没有一个有相关的答案(因此,如果类似问题没有答案,请不要将此问题标记为重复问题) 我的第一个想法是使用上传的文件名+guid保存文件,并将该文件名保存到会话状态,但我在前面的问题上得到的答案都非常坚定,这是一个糟糕的解决方案 我找到的解决其他类似问题的方法:如何使用C#MVC在控制器之间保存文件?,c#,asp.net-mvc,C#,Asp.net Mvc,我问了之前的一个问题,其中一个问题本身似乎是一个完整的主题 我正试图跨控制器调用保留一个文件数据 场景是:用户上传一个包含要提交到数据库的条目的文件。如果文件有警告和错误,它们将被重定向到验证页面。如果没有警告或错误,将直接处理其文件 如果用户收到警告但没有错误(即文本字段太长,将被截断),他们仍然可以导入文件。由于上传文件和将文件发送到数据库之间有两个单独的屏幕,因此需要保留文件数据 我见过十几个与此类似的问题,但似乎没有一个有相关的答案(因此,如果类似问题没有答案,请不要将此问题标记为重复问
编辑:我的用户确实有可用的会话。我能想到的另一个解决方案是在会话ID中包含的GUID中附加一个硬编码字符串,例如“MyImporter xxxx.xxxx.xxxx.xxxx.csv”。这样,“MyImporter”就可以是一个私有常量字符串,我的控制器就不必保留任何标识符。我不确定这种方法有什么缺点,但由于我对MVC还很熟悉,所以肯定有一些情况我没有想到。你听说过
TempData
?它就像一个自毁会话值。最好将文件的位置存储在服务器上。会话或数据库
流量:
另一种可能的解决方案是将文件位置存储在加密的cookie中,该cookie将在后续请求时发送。您的用户是否经过身份验证?您好,谢谢您的快速回复。用户有一个会话。我相信我可以从这里访问的属性是唯一的会话ID和公司ID号。谢谢您的回复。将其存储在会话中遭到了大量响应的否决(尽管我承认我没有完全理解他们的论点)。另外,如果我将其保存在数据库中,那么我必须保留数据库ID,使我处于完全相同的情况。为了使其更安全,您必须生成一个难以猜测的标识符,然后在数据库中使用该标识符。此标识符也将发送到视图,并在后续请求时传回。使用简单的自动递增整数ID是不够的,因为一个用户可以猜测其他用户的ID并处理其文件。编辑注释:没有可用的用户ID。只有公司ID和会话ID。这与使用会话ID作为名称的一部分保存临时文件(例如“ImportFile xxxx.xxxx.xxxx.xxxx.csv”)有什么不同吗?如果您已经在应用程序中使用会话,则不再麻烦。将位置存储在ASP.NET会话变量中。如下所示:
会话[“uploadedFileLocation”]=@“c:\foobar\App\u Data\bar.baz”代码>。在我的回答中,我解释了使用会话和将文件位置存储在数据库中的替代方法。感谢您的快速回复。这是我最初的解决方案,它被每个看过它的人都否决了。最糟糕的是“我真的很想知道你为什么试图在你的控制器中使用会话。或者我们正在将旧代码升级到mvc,而这还没有得到处理?”谢谢你的回答。我发现:“TempData是会话,所以它们没有完全不同。但是,区别很容易理解,因为TempData用于重定向,并且只用于重定向。因此,当您在TempData中设置一些消息,然后重定向时,您正确地使用了TempData。”在堆栈溢出的深处,所以不要认为这是一个正确的用法。