2009-06-06 31 views
5

我在FILESTREAM中将图像存储在我的数据库中,我正试图找出最佳解决方案是如何将该图像返回到Web浏览器。什么是将图像从SQL中的FILESTREAM流式传输到浏览器的最快捷方式?

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

Response.TransmitFile(pathToFile); 

这并不传送回客户端(我的理解)之前将文件加载到内存中而且这样很好,很快。

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

迄今做的这个相当丑陋的方式:

Response.WriteBinary(fileStreamBinary.ToArray()); 

难道我会是最好不要用困扰的LINQ to SQL和更直接地做事情?

我开始想知道为什么我首先对FILESTREAM感到困扰,并不仅仅是自己管理文件。我敢肯定,没有使用“流浪汉”这个词是有原因的!

回答

1

这不将文件加载到内存传送回 客户端(我的理解)之前,因此是很好的和快速的。

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

我会更好吗没有打扰Linq to SQL,并更直接地做事?

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

我开始想知道为什么我在第一 地方FILESTREAM困扰,并没有只是坚持管理文件自己

主要好处是事务性的支持和包容数据的完整性在数据库备份中,所以您不必担心数据库备份和文件系统备份之间的差异。缺点一直是性能,这是整个文件流功能正在努力克服的问题。尽管根据this document它们平均小于1mb,但它实际上比在文件系统中更快地存储在数据库中。

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

1

那该怎么办?

byte[] buffer = new byte[bufferSize]; 
int nBytes; 
while((nBytes = fileStreamBinary.Read(buffer, 0, bufferSize) != 0) 
{ 
    Response.OutputStream.Write(buffer, 0, nBytes); 
} 

这样,你永远不会整个流加载到内存

+0

嗯,也许我们正在谈论不同的二进制对象类型 - Linq返回一个System.Data.Linq.Binary对象,它没有Read()方法:( – joshcomley 2009-06-06 01:28:00

0

基本上相同的思路提出了托马斯,但有点冗长。 应该关闭缓冲区并定期提交/刷新数据,以避免在发送到客户端之前缓冲所有传入数据。

我使用类似的代码流数据(在这种情况下全文:S)在数据库从斑点 - >WCF服务(流) - >客户(浏览器)

这对于较小的项目可能不是最好的方法,但对于传输来自某种流的东西很有用。

Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.Buffer = false; 

var buffer = new byte[BufferSize]; 
int bytesRead; 
while ((bytesRead = inputStream.Read(buffer, 0, BufferSize)) != 0) 
{ 
    if (!Response.IsClientConnected) 
      break; 

    Response.OutputStream.Write(buffer, 0, bytesRead); 
    Response.Flush(); 
} 
相关问题