Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#MVC在控制器之间保存文件?_C#_Asp.net Mvc - Fatal编程技术网

如何使用C#MVC在控制器之间保存文件?

如何使用C#MVC在控制器之间保存文件?,c#,asp.net-mvc,C#,Asp.net Mvc,我问了之前的一个问题,其中一个问题本身似乎是一个完整的主题 我正试图跨控制器调用保留一个文件数据 场景是:用户上传一个包含要提交到数据库的条目的文件。如果文件有警告和错误,它们将被重定向到验证页面。如果没有警告或错误,将直接处理其文件 如果用户收到警告但没有错误(即文本字段太长,将被截断),他们仍然可以导入文件。由于上传文件和将文件发送到数据库之间有两个单独的屏幕,因此需要保留文件数据 我见过十几个与此类似的问题,但似乎没有一个有相关的答案(因此,如果类似问题没有答案,请不要将此问题标记为重复问

我问了之前的一个问题,其中一个问题本身似乎是一个完整的主题

我正试图跨控制器调用保留一个文件数据

场景是:用户上传一个包含要提交到数据库的条目的文件。如果文件有警告和错误,它们将被重定向到验证页面。如果没有警告或错误,将直接处理其文件

如果用户收到警告但没有错误(即文本字段太长,将被截断),他们仍然可以导入文件。由于上传文件和将文件发送到数据库之间有两个单独的屏幕,因此需要保留文件数据

我见过十几个与此类似的问题,但似乎没有一个有相关的答案(因此,如果类似问题没有答案,请不要将此问题标记为重复问题)

我的第一个想法是使用上传的文件名+guid保存文件,并将该文件名保存到会话状态,但我在前面的问题上得到的答案都非常坚定,这是一个糟糕的解决方案

我找到的解决其他类似问题的方法:

  • 重新加载文件(一个糟糕的解决方案)
  • 使用viewbag将文件名发送到视图,并发送回第二个控制器(听起来不对)
  • 在视图模型中保存要发送到视图的文件位置,由第二个控制器再次检索(同样听起来不正确)
  • 在会话或临时数据中保存文件位置(收到通常不合适的备注)
  • 我已经做了我的研究,找不到最好的方法去做这件事。有人能帮我吗?如果你认为另一个问题可以回答这个问题,请你把它作为答案发给我,而不是重复报告,因为我已经做了相当多的搜索

    谢谢,, 塞缪尔·戴维斯


    编辑:我的用户确实有可用的会话。我能想到的另一个解决方案是在会话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。”在堆栈溢出的深处,所以不要认为这是一个正确的用法。