将上载的文件直接流式传输到数据库表中

时间:2009-11-16 18:11:39

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

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

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

除了附在帖子上的标签外,您没有提供有关您使用环境的更多信息。

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

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

答案 2 :(得分:0)

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

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

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

中使用

答案 3 :(得分:-2)

我认为在数据库中存储大文件是不切实际的,特别是通过上传(我假设上传是通过浏览器进行的。)

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

更新:看起来我对分块的看法可能不对。 SQL Server支持UPDATETEXT

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