Как читать файл по частям из базы данных с помощью стандартного приложения Dapper in dot net - PullRequest
1 голос
/ 27 мая 2020

Я создал стандартное приложение dot net для центрального места для хранения файлов. Мне удалось загрузить файл кусками, потому что в основном я оставляю клиенту отправлять куски и просто добавляю их как поток в базу данных, но проблема возникает, когда я хочу сделать это обратно, получая файл кусками из базу данных (возможно, с парой sql запросов) и не отправлять ее сразу. Есть возможность сделать с SqlFileStream, но это невозможно в стандартном приложении dot net, поэтому я ищу некоторые решения с помощью Dapper reader, может быть? Нашел здесь пример кода - { ссылка }, но я не уверен, смогу ли я сделать это с помощью dapper. Мы высоко ценим каждое предложение.

1 Ответ

0 голосов
/ 27 мая 2020

Нашел это решение с передачей Stream. В основном, используя поток Respose.Body от клиента asp. net mvc и изменяя его напрямую, не возвращая никаких данных. Таким образом, при получении файла начинается отправка фрагментов напрямую клиенту без использования всей памяти сервера (за раз указывается только этот 1 МБ).

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;
                }
            }
        }
...