首页 > 解决方案 > 如何在 dot net 标准应用程序中使用 Dapper 从数据库中读取块中的文件

问题描述

我为存储文件的中心位置创建了一个点网标准应用程序。我已经设法以块的形式上传文件,因为基本上我让客户端发送块并将它们作为流附加到数据库中,但是当我想返回时问题就来了,从块中检索文件数据库(可能有几个 sql 查询)而不是一次发送。有可能使用 SqlFileStream 来完成,但在 dot net 标准应用程序中是不可能的,因此我正在寻求一些使用 Dapper 阅读器的解决方案可能是?在这里找到了一些示例代码 - https://stackoverflow.com/a/2101447但我不确定我是否可以用 dapper 做到这一点。每一个提议都非常感谢。

标签: c#sqldapper

解决方案


通过传递 Stream 找到了这个解决方案。基本上使用来自客户端 asp.net mvc 的 Respose.Body 流并直接修改它而不返回任何数据。因此,文件 get 开始直接向客户端发送块,而不使用整个服务器内存(一次仅指定 1mb)。

var sql = $@"
    SELECT [Data]
    FROM {TableName}
    WHERE ChunkId = @chunkId";

        using (var conn = this.dbConnectionFactory.GetSqlConnection)
        using (var reader = await conn.ExecuteReaderAsync(sql, new { chunkId }).ConfigureAwait(false))
        {
            while (reader.Read())
            {
                var buffer = new byte[1024 * 1024]; // Read chunks of 1MB
                var bytesRead = 0L;
                var dataIndex = 0L;

                while ((bytesRead = reader.GetBytes(0, dataIndex, buffer, 0, buffer.Length)) > 0)
                {
                    var actual = new byte[bytesRead];
                    Array.Copy(buffer, 0, actual, 0, bytesRead);

                    await stream.WriteAsync(actual, 0, (int)bytesRead).ConfigureAwait(false);

                    dataIndex += bytesRead;
                }
            }
        }

推荐阅读