.net - 将图像从 SQL 中的 FILESTREAM 流式传输到浏览器的最快方法是什么?

标签 .net sql-server linq-to-sql filestream

我的数据库中以 FILESTREAM 形式存储了图像,我正在尝试找出将该图像返回到网络浏览器的最佳解决方案。

如果我自己管理文件系统上的文件,最快的方法是:

Response.TransmitFile(pathToFile);

这不会在将文件传输回客户端之前将其加载到内存中(据我所知),因此非常好且快速。

我目前正在使用 Linq to SQL 来获取 FILESTREAM。这将 FILESTREAM 作为二进制对象提供。

到目前为止,这种做法相当丑陋:

Response.WriteBinary(fileStreamBinary.ToArray());

如果我不费心使用 Linq to SQL 并更直接地做事,会不会更好?

我开始想知道为什么我一开始就为 FILESTREAM 烦恼,而不是坚持自己管理文件。我确信在不使用“潮流”这个词的情况下这是有原因的!

最佳答案

This does not load the file into memory before transmitting it back to the client (to my understanding) and as such is nice and speedy.

正确,但记得将Response.BufferOutput 设置为 false,默认值为 true。

Am I going to be better off not bothering with the Linq to SQL and doing things more directly?

如果您不想先将整个二进制内容加载到内存中,那么可以。这是an example用于从数据库流式传输二进制数据(以及启用可恢复下载功能)。

I'm beginning to wonder why I bothered with FILESTREAM in the first place and didn't just stick to managing the files myself

主要好处是数据完整性以及事务支持和包含在数据库备份中,因此您不必担心数据库备份和文件系统备份之间的差异。缺点始终是性能,这就是整个文件流功能试图克服的问题。尽管根据this document它们平均小于1mb实际上,它存储在数据库中比存储在文件系统中更快。

在 Sql Server 2012 中,有一个名为 FileTables 的新功能。它建立在 FileStream 支持之上。基本上,它的作用类似于文件系统目录的数据库 View ,添加到该目录的文件会自动添加到数据库 FileTable(是一个固定模式表,其中包含文件的 Filestream 二进制列,您可以从其他表链接到该列) )。然后,这将允许您检索可提供给您的 Response.TransmitFile(...) 函数的文件的路径,但仍然受益于 sql Filestream 支持。

关于.net - 将图像从 SQL 中的 FILESTREAM 流式传输到浏览器的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/958725/

相关文章:

c# - 如何使用 Polly 过滤重试策略的特定端点

c# - Freezable.IsFrozen 和 DependencyObject.IsSealed

c# - 十进制类型的声明后缀

c# - 通过 EntityFramework 插入默认值

sql-server - 选择声明以显示丢失的记录(简单问题)

c# - 将两个包含属性的对象合并为一个对象

SQL 服务器 : aggregate functions and GROUP BY in long queries

c# - SQL Server : Event does not reference any tables (Tuning Advisor warning)

database - linq执行命令

asp.net-mvc - LINQ : System. Data.SqlClient.SqlException: 字符串或二进制数据将被截断