【发布时间】:2017-08-30 04:32:56
【问题描述】:
我需要上传和读取大文件(大小超过 500 MB)。我在 SQL Server 中有一个数据类型为 varbinary(MAX) 的列文件要存储。
我想使用 C# 上传和读取文件。我需要传递字节数组将文件存储在 SQL Server 数据库中。但是在上传大文件时初始化字节时出现错误。
我可以上传大小为 250MB 的文件。但我尝试上传超过 500 MB 的文件,它在初始化字节数组时抛出“内存不足”异常。
byte[] fileByte = new byte[file.ContentLength]; // "Out of Memory" exception
file.InputStream.Read(fileByte, 0, fileByte.Length);
我也试过
BinaryReader br = new BinaryReader(inputStream);
byte[] fileByte = br.ReadBytes(file.ContentLength); // "Out of Memory" exception
为了文件安全,我不想分块上传和下载文件。如果有人帮我上传大文件或修复“内存不足异常”的方法,请告诉我。
谢谢。
【问题讨论】:
-
设置
Response.BufferOutput = false;以防止缓冲。可能的骗子:stackoverflow.com/questions/2809514/… & stackoverflow.com/questions/3362849/…。 -
我不建议将文件保存在数据库表中。关系数据库可以存储二进制数据,但效率不高。如果您的版本支持,请考虑将文件保存到文件流/文件表。否则,将其路径存储在表中的常规文件服务器上存储也可能就足够了
-
我在 SQL Server 2012 中使用了 filestream/filetable。但是从 filetable 读取文件时遇到了问题。我需要将文件流转换为字节数组,同时将文件从数据库读取到 C# 中。当时我收到“内存不足”异常。
-
32 位应用程序? 500mb 听起来非常小,以至于内存不足。有没有你不使用 SQ LServer FIlestream 的原因(请注意,这与 C# 文件流docs.microsoft.com/en-us/sql/relational-databases/blob/… 基本上将二进制列透明地存储在文件系统中。它还具有允许您获取文件名的 SQL 函数,因此您可以直接阅读。
标签: c# sql-server asp.net-mvc