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

jos*_*ley 5 .net sql-server filestream linq-to-sql

我将图像存储在我的数据库中的FILESTREAM中,我试图找出将图像恢复到Web浏览器的最佳解决方案.

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

Response.TransmitFile(pathToFile);
Run Code Online (Sandbox Code Playgroud)

在将文件传回客户端之前(根据我的理解),这不会将文件加载到内存中,因此很好而且速度很快.

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

到目前为止,有这种非常丑陋的方式:

Response.WriteBinary(fileStreamBinary.ToArray());
Run Code Online (Sandbox Code Playgroud)

我是否会更好地避免使用Linq to SQL并更直接地做事情?

我开始想知道为什么我首先对FILESTREAM感到困扰并且不仅仅是坚持自己管理文件.我确定没有使用"赶时髦"这个词就有理由!

Mic*_*ael 1

在将文件传输回客户端之前,这不会将文件加载到内存中(据我的理解),因此很好而且很快。

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

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

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

我开始想知道为什么我一开始就为 FILESTREAM 烦恼,而不是仅仅坚持自己管理文件

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

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