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

Streaming a large file into a database BLOB field

我在磁盘上有一个大文件,我需要将其内容作为 VARBINARY(MAX) 字段存储在 SqlServer 数据库中。 "contents",我的意思是使用类似 File.ReadAllBytes() 的东西。 (我理解其中的隐患,但这是当前的操作模式,所以我暂时不得不处理它。)

我找到了这个答案,它提供了一种通过使用 UPDATE.WRITE:

流式传输大型 Byte[] 的方法

How to I serialize a large graph of .NET object into a SQL Server BLOB without creating a large buffer?

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

OutOfMemoryException when I read 500MB FileStream

我可能忽略了一些明显的东西,但我不知道应该如何从磁盘上的大文件中获取结果存储到数据库中。

根据我从这两页获得的一些提示,我得到了一个有效的答案:

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

How do I copy the contents of one stream to another?

基本上,它使用与序列化 Blob 的答案相同的方法,但不是使用 BinaryFormatter(我无论如何都不喜欢 class),而是创建一个 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);
    }
}

所以诀窍是 link 两个流,以分块的方式将数据从一个流复制到另一个流,如评论中所述。