我有几个应用程序允许用户上传存储在数据库表中的附件。这已经好几年了,因为它最初用于小图像文件,但现在他们想要上传非常大的文件(~80MB)。这导致服务器内存不足(并且上传失败),因为为了将二进制数据写入数据库,我将整个内容加载到字节数组中。许多(如果不是大多数)文件上传的在线示例都使用此方法(请参阅http://www.aspnettutorials.com/tutorials/database/Save-Img-ToDB-Csharp.aspx作为示例)。
现在,问题是,我可以以某种方式将二进制内容流式传输到数据库,而不是将整个内容加载到字节数组中,然后将字节数组设置为参数化值吗?此时切换到基于文件而不是基于数据库的存储将是一件大事......
答案 0 :(得分:1)
也许这个article可以指向正确的方向。
答案 1 :(得分:0)
除了附在帖子上的标签外,您没有提供有关您使用环境的更多信息。
您应该使用数据库服务器的流功能(以及您使用的连接层)通过流发送数据。
似乎只支持可搜索流,因此您应首先将上传文件写入临时文件(使用流,不要将文件缓冲在内存中),然后使用FileStream将文件插入数据库。
答案 2 :(得分:0)
您需要一个客户端应用程序(Silverlight,Java Applet,Flash等),它将您的文件分成小块并将其发送到服务器;
在服务器上,您需要调用数据库并保存该块;在我的测试中,最佳表现来自UPDATETEXT
请注意,您需要执行与提供文件下载类似的操作;我建议您阅读READTEXT
函数,与UPDATETEXT
完全相同,并在IHttpAsyncHandler
答案 3 :(得分:-2)
我认为在数据库中存储大文件是不切实际的,特别是通过上传(我假设上传是通过浏览器进行的。)
至少,您需要将文件上传到服务器上的保留文件夹,并在完全上传后将其移动到数据库中。否则,您必须弄清楚如何使用多个更新将字节流分块到数据库中。我不认为你可以附加到已经在记录中的BLOB。
更新:看起来我对分块的看法可能不对。 SQL Server支持UPDATETEXT。
我仍然认为上传大文件并将其“流式传输”到数据库中的文件很脆弱,并且存在可靠性问题。