如何访问存储在SQL Server的FileTable中的文件?

时间:2017-01-17 12:39:32

标签: sql sql-server asp.net-mvc filetable

据我所知,自2012版以来SQL Server有一个新功能FileTable。它允许我们将文件存储在文件系统中并从T-SQL中使用它们。

我正在尝试使用此功能,但我不知道如何正确地执行此操作。

通常,我不知道如何访问存储在文件表中的文件。假设我有asp.net MVC应用程序,并且我在img标签的网页上显示了很多图像。我想将这些图像存储在Filetable中,并将它们作为文件系统中的文件进行访问。但我不知道这些文件的存储位置以及如何将它们用作文件。现在我的图像存储在文件夹图像中的Web应用程序目录中,我写了这样的内容:

<img src='/images/mypicture.png' />

如果我将图像移动到文件表中我应该在src中写什么?

<img src='path-toimage-in-filetable' />

2 个答案:

答案 0 :(得分:0)

我认为FileTable实际上意味着FileStream。关于这一点的几点说明:

  1. 如果您的文件实际上是文件,则最好使用此功能
  2. 文件平均应该大于1mb - 尽管此规则可能有例外,如果它们平均小于1mb,最好使用VARBINARY(MAX)或{{1适当的数据类型。如果您的图片平均非常小(只有几KB),请考虑使用XML列。
  3. 访问这些文件需要打开一个事务,并且数据库已正确配置为VARBINARY(MAX)
  4. 通过告诉SQL Server您希望直接访问该文件,您可以绕过正常的SQL引擎/数据库文件数据访问方法获得一些显着的优势,但它并不意味着直接访问文件系统上的文件并尝试这样做可以打破SQL对这些文件的管理(事务一致性,跟踪,锁定等)。
  5. 如果您真的需要SQL,那么使用CDN并在表中存储图像URL很可能会更好地满足您的用例。您可以使用FILESTREAM执行此操作(请参阅下面的代码示例,了解一个实现),但是您将为每个请求敲击SQL服务器,除非您将图像存储在其他地方,无论如何浏览器可以正确缓存(我的示例不会这样做) - 如果您将它们存储在其他地方以便在浏览器中进行渲染,您也可以将它们存储在那里(一旦这些图像将不具有事务一致性)无论如何都要复制到其他驱动器/磁盘/位置。)
  6. 尽管如此,这里有一个如何使用ADO.NET访问FILESTREAM数据的示例:

    FILESTREAM

    显然,如果你有很多图像需要处理,这不是一个理想的方法 - 不要试图将SQL服务器的实例变成你应该使用CDN的那个......但是,如果你还有其他很好的理由,你应该尝试在单个请求/事务中抓取尽可能多的图像(例如,如果你知道你在一个页面上显示50个图像,在单个事务范围内获得所有50个图像,请不要使用50个事务范围 - 此代码不会处理该事务。)

答案 1 :(得分:0)

我认为你仍然不需要这个,不管怎样我会把答案发给其他感兴趣的人。 首先,文件表仍然是一个表,因此,如果要从中访问数据,则需要使用Select SQL语句。所以你需要这样的东西:

select name, file_stream from filetable_name 
where 
name = 'file_name',
file_type = 'file_extension'

只需在你的asp.net应用程序中执行这样的语句,然后获取结果并使用file_stream列获取存储文件的二进制数据。如果要从HTML检索文件,首先需要在控制器中创建一个操作,该操作将返回检索到的文件:

public ActionResult GetFile(){
..
return File(file.file_stream,file.file_type);
}

在此之后,输入HTML标签,如:

<img src="/controller/GetFile" />
希望这可以帮到你! 如果你想知道文件表的架构,请参阅 here