将大文件流式传输到数据库BLOB字段

本文关键字:数据库 BLOB 字段 传输 文件 | 更新日期: 2023-09-27 18:18:51

我在磁盘上有一个大文件,我需要将其内容存储在SqlServer数据库中作为VARBINARY(MAX)字段。所谓"内容",我指的是使用File.ReadAllBytes()之类的东西。(我理解这样做的缺陷,但这是当前的操作模式,所以我现在必须处理它。)

我找到了这个答案,它提供了一种通过使用UPDATE.WRITE来流式传输大型Byte[]的方法:

我如何序列化一个大图的。net对象到一个SQL Server BLOB没有创建一个大的缓冲区?

然而,简单地将大文件的内容读入内存中的Byte[]会导致这个问题:

OutOfMemoryException when I read 500MB FileStream

我可能忽略了一些明显的东西,但我就是不知道应该如何从磁盘上的大文件到数据库的最终存储

将大文件流式传输到数据库BLOB字段

使用我从这两页得到的一些提示,我有一个有效的答案:

http://www.syntaxwarriors.com/2013/stream-varbinary-data-to-and-from-mssql-using-csharp/(这看起来很像序列化SO的答案,但这里有更多…不知道谁复制了谁!)。

如何将一个流的内容复制到另一个流?

基本上,它使用了与关于序列化blob的答案相同的方法,但不是使用BinaryFormatter(无论如何我都不喜欢的类),它创建了一个FileStream,它接受文件的路径,以及一个扩展方法将该流复制到目标流,或BlobStream,如示例所示。

扩展名:

public static class StreamEx
{
    public static void CopyTo(this Stream Input, Stream Output)
    {
        var buffer = new Byte[32768];
        Int32 bytesRead;
        while ((bytesRead = Input.Read(buffer, 0, buffer.Length)) > 0)
            Output.Write(buffer, 0, bytesRead);
    }
}

所以技巧是链接两个流,以块的方式将数据从一个复制到另一个,正如评论中所指出的。