5

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

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

Response.TransmitFile(pathToFile);

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

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

到目前为止,有这种非常丑陋的做法:

Response.WriteBinary(fileStreamBinary.ToArray());

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

我开始想知道为什么我首先要打扰 FILESTREAM 并且不只是坚持自己管理文件。我敢肯定没有使用“潮流”这个词是有原因的!

4

3 回答 3

1

那个怎么样 ?

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

这样你就永远不会将整个流加载到内存中

于 2009-06-06T01:19:26.363 回答
1

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

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

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

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

我开始想知道为什么我首先要打扰 FILESTREAM 并且不只是坚持自己管理文件

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

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

于 2012-02-02T02:49:09.747 回答
0

基本上与 Thomas 提出的想法相同,但更冗长一些。应关闭缓冲并定期提交/刷新数据,以避免在将所有传入数据发送到客户端之前对其进行缓冲。

我正在使用类似的代码从数据库中的 Blob 流式传输数据(在本例中为 Pdf: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();
}
于 2011-04-14T12:15:11.150 回答