【问题标题】:C# upload and read large file with databseC# 使用数据库上传和读取大文件
【发布时间】: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


【解决方案1】:

如果 SP 在具有 bulkadmin 服务器权限的人下运行,SQL 服务器可以直接从文件系统读取文件。这个批量命令对我们有用:

update someTable
set FileData = (select * from openrowset(bulk ''' + @filepath + ''', single_blob) as blob)
where id = 1;

Share 目录需要适当的权限,我们在所有情况下都遇到了问题,因为它实际上不在数据库服务器上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2015-10-01
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多