【问题标题】:Streaming uploaded files directly into a database table将上传的文件直接流式传输到数据库表中
【发布时间】:2009-11-16 18:11:38
【问题描述】:

我有几个应用程序允许用户上传存储在数据库表中的附件。这已经运行了好几年,因为它最初是为小图像文件设计的,但现在他们想要上传非常大的文件(~80MB)。这导致服务器内存不足(并且上传失败),因为为了将二进制数据写入数据库,我将整个内容加载到字节数组中。许多(如果不是大多数)在线文件上传示例都使用这种方法(请参阅http://www.aspnettutorials.com/tutorials/database/Save-Img-ToDB-Csharp.aspx 作为示例)。

现在,问题是,我能否以某种方式将二进制内容流式传输到数据库,而不是将整个内容加载到字节数组中,然后将字节数组设置为参数化值?在这一点上,切换到基于文件而不是基于数据库的存储将是一件大事......

【问题讨论】:

    标签: asp.net sql-server file-upload


    【解决方案1】:

    也许这个article 可以为您指明正确的方向。

    【讨论】:

      【解决方案2】:

      除了您在帖子中附加的标签之外,您没有提供太多关于您使用的环境的信息。

      您应该使用数据库服务器(以及您使用的连接层)的流式传输功能通过流式传输数据。

      似乎只支持可搜索的流,所以您应该先将上传文件写入临时文件(使用流,不要在内存中缓冲文件),然后使用 FileStream 将文件插入数据库。

      【讨论】:

      • 我认为使用的标签很好地描述了他的环境。
      【解决方案3】:

      您需要一个客户端应用程序(Silverlight、Java Applet、Flash 等),它将您的文件分成小块并将其发送到服务器;

      在服务器上,您需要调用数据库并保存该块;在我的测试中,最佳性能来自UPDATETEXT

      请注意,您需要执行类似的操作来提供文件下载;我建议阅读READTEXT 函数,与UPDATETEXT 完全相同,并在IHttpAsyncHandler 中使用它

      【讨论】:

        【解决方案4】:

        我认为将这么大的文件存储在数据库中是不切实际的,尤其是通过上传(我假设上传是通过浏览器)。

        至少,您希望将文件上传到服务器上的保存文件夹,并在完全上传后将其移动到数据库中。否则,您必须弄清楚如何使用多次更新将字节流分块到数据库中。我不认为你可以追加到已经在记录中的 BLOB。

        更新:看起来我可能对分块有误。 SQL Server 支持UPDATETEXT

        我仍然认为上传这么大的文件并将它们“流式传输”到数据库中是脆弱的,并且存在可靠性问题。

        【讨论】:

        • 一些数据库本身支持流(例如 Oracle 流),这将允许您将数据流式传输到 RDBM,而无需发出多次更新。
        • 将文件流式传输到数据库与其说是通过浏览器上传大文件的可靠性问题。如果您有耐心的用户在上传时没有意外关闭浏览器,这可能没什么大不了的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 2020-01-20
        • 1970-01-01
        • 2021-05-28
        • 2020-01-15
        • 1970-01-01
        相关资源
        最近更新 更多