gpt4 book ai didi

c# - 制作一个返回 BLOB 的 get api .net core (EF)

转载 作者:行者123 更新时间:2023-12-02 07:51:31 24 4
gpt4 key购买 nike

我有一个数据库,其中的表有一个 id 和一个 BLOB。我想要的是获取 blob 并将其传输到客户端,并且不在内存中检索它。这是因为 blob 可能非常大(数百 MB)。

我几乎已经使用 SQLdataReader 实现了这一点。这样做,当我发出 get 请求时,它会立即开始下载,并且不会产生内存开销。这是使用.net core 2.2但是,当我切换到.net core 3.1时,现在它不起作用,并且内存被填满了数百兆字节。我也想使用 Entity Framework 达到相同的结果,但到目前为止我还没有找到任何好的在线资源。

这是我到目前为止的代码。

[HttpGet]
public IEnumerable<Byte[]> GetStreaming()
{

var header = Request.Headers["Accept-Encoding"];
System.Console.WriteLine(header);

string connectionString = "Data Source=myPc\\SQLEXPRESS;Initial Catalog=dbo;Persist Security Info=True;User ID=sa;Password=admin";

//----------------------
SqlConnection connection = new SqlConnection(connectionString);

connection.Open();

SqlCommand command = new SqlCommand("exec getBlob", connection);

SqlTransaction tran = connection.BeginTransaction(IsolationLevel.ReadCommitted);
command.Transaction = tran;
byte[] buffer = new byte[5000000];
long position = 0;
long bytesRead = 5000000;
using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess))
{
reader.Read();
reader.GetBytes(0, position, null, 0, 5000000);
while (bytesRead == 5000000)
{
// Get the pointer for file
bytesRead = reader.GetBytes(0, position, buffer, 0, 5000000);
position += bytesRead;
yield return buffer;

// Create the SqlFileStream

}

}

}

我尝试过这样做

        public  IEnumerable<byte[]> DownloadFile()
{

yield return context.t_noFs.Where(u => u.Id == 1)
.Select(u => u.dat).
FirstOrDefault();
}

虽然这确实返回了一个值,但它没有达到预期的效果并且填满了内存。

最佳答案

您的情况的最佳实践是使用流。

[HttpGet]
public FileStreamResult GetStreaming()
{
var header = Request.Headers["Accept-Encoding"];
System.Console.WriteLine(header);

string connectionString = "Data Source=myPc\\SQLEXPRESS;Initial Catalog=dbo;Persist Security Info=True;User ID=sa;Password=admin";

//----------------------
SqlConnection connection = new SqlConnection(connectionString);

connection.Open();

SqlCommand command = new SqlCommand("exec getBlob", connection);

SqlTransaction tran = connection.BeginTransaction(IsolationLevel.ReadCommitted);
command.Transaction = tran;
SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess)
var blobStream = reader.GetStream(0);

return new FileStreamResult(blobStream, "application/x-binary")
{
FileDownloadName = "your file name"
};
}

关于c# - 制作一个返回 BLOB 的 get api .net core (EF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59999729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com