C# ASP.NET上载的文件

C# ASP.NET上载的文件,c#,asp.net,file,file-upload,C#,Asp.net,File,File Upload,我有一个ASP.NET web应用程序,它在客户端使用jQuery。 在其中一个web表单上,我有一堆控件要填写,还有一个上载控件。 用户可以在填写表单上的其他条目时运行上载。 当用户保存表单时,包括文件在内的所有数据都存储到数据库中。 问题是当用户填写表单时,如何处理上传的文件? 我有两种可能的解决方案,但不知道哪一种更为理想 缓存上载的文件,稍后在保存时检索该文件并将其与所有其他数据一起存储到数据库中 将文件保存在临时文件夹中,然后读取它 这方面的最佳解决方案是什么? 提前谢谢。怎么样: 3

我有一个ASP.NET web应用程序,它在客户端使用jQuery。 在其中一个web表单上,我有一堆控件要填写,还有一个上载控件。 用户可以在填写表单上的其他条目时运行上载。 当用户保存表单时,包括文件在内的所有数据都存储到数据库中。 问题是当用户填写表单时,如何处理上传的文件? 我有两种可能的解决方案,但不知道哪一种更为理想

  • 缓存上载的文件,稍后在保存时检索该文件并将其与所有其他数据一起存储到数据库中
  • 将文件保存在临时文件夹中,然后读取它
  • 这方面的最佳解决方案是什么? 提前谢谢。

    怎么样:

    3:将其存储在数据库中,但标记为处于不完整状态


    这可以是一个单独的表,也可以是具有状态列的同一个表。

    我看不出这两个选项之间的区别:缓存文件是什么意思?这和保存到临时文件夹不一样吗? 顺便说一句,大多数网站在填写完整个表单后才会开始上传(如果你的用户取消或浏览了怎么办?)。然后,它们会显示一个临时进度条(“请稍候,我们正在分析您的数据…”)。
    作为一般设计规则,在任何时间点接收部分数据可能会导致以后的数据变化。如果必须分步执行,请将表单更改为向导

    我认为最合适的解决方案是将上传的文件存储在缓存中。 这是密码

        var fileKey = Guid.NewGuid();
        var fileStream = new Byte[Request.Files[0].ContentLength];
        Request.Files[0].InputStream.Read(fileStream, 0, Request.Files[0].ContentLength);
        Cache[fileKey.ToString()] = fileStream;
    
    fileKey GUID可以存储在ViewState中,也可以作为响应发送给客户端。 稍后,当保存整个表单时,可以检索缓存的文件并将其与其他数据一起存储到数据库中。 这种方法的好处是,如果用户从页面导航,缓存文件将过期,从而避免资源泛滥。 我们可以使用

    Cache.Add(fileKey, fileStream, null, DateTime.UtcNow.AddMinutes(10), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
    

    功能。

    与前面提到的其他人一样,您只需上传即可。您可以通过多种方式实现:

  • 将文件上传到一个临时文件夹中,当他们最后说“保存”或“完成”时,您可以将文件从该临时文件夹移动到另一个通常保存常规文件的文件夹中
  • 还有一件事,你可以做,每当用户点击上传按钮的临时文件,是你可以检查你的临时文件夹和清除其他文件已停留在那里超过1-2天/周,这样你就知道你肯定没有浪费空间 也许,你也可以有一个计时器 定期清理的网站 这个文件夹。我认为这更重要 效率高,你不必等待 供用户进入并单击 上传按钮来清理你的空间


    这就是为什么缓存文件有很多优点,比如设置过期时间。因此,如果用户离开页面,缓存项将过期。无法更改数据库。我正在升级现有的应用程序。这种方法真的很混乱。我需要一个临时文件夹,我需要一个清理方法,我需要一个计时器。这太过分了。正如我所说,缓存文件字节数组将完成这项工作。此外,我将文件保存在数据库中,而不是本地文件夹中。当然,这很混乱,但我在阅读后建议您不要更改数据库模式。想想当10个用户分别上传2mb文件时的开销,这样您就可以将其保存到20mb的缓存中。这是一个好主意,如果你,也许,有很多RAM玩。