Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使FileStream文件可用于web应用程序_Sql Server_Asp.net Core_Filestream_File Storage - Fatal编程技术网

Sql server 如何使FileStream文件可用于web应用程序

Sql server 如何使FileStream文件可用于web应用程序,sql-server,asp.net-core,filestream,file-storage,Sql Server,Asp.net Core,Filestream,File Storage,我一直在试图找出将存储在SQLServerDB中的文件作为FILESTREAM提供给web应用程序的最佳方法 基本上,我有一个用Vue编写的Web应用程序,Vue是一个ASP.NET核心WebApi支持它,当用户上传一个图像(作为varbinary(max)FILESTREAM存储在数据库中)时,用户应该能够在浏览器中查看图像 我想使用 所以问题是:如何从数据库中的记录中获取{url to image}img标记的{url to image}。我需要把它改成1。跨多个服务器工作,因此如果web应

我一直在试图找出将存储在SQLServerDB中的文件作为
FILESTREAM
提供给web应用程序的最佳方法

基本上,我有一个用Vue编写的Web应用程序,Vue是一个ASP.NET核心WebApi支持它,当用户上传一个图像(作为
varbinary(max)FILESTREAM
存储在数据库中)时,用户应该能够在浏览器中查看图像

我想使用

所以问题是:如何从数据库中的记录中获取
{url to image}
img标记的
{url to image}
。我需要把它改成1。跨多个服务器工作,因此如果web应用程序和db位于不同的服务器上。二,。我需要url作为一个别名,这样就不会泄露存储文件的文件夹结构

如果有必要,我也愿意听取任何关于如何以不同方式处理文件存储的建议

谢谢

如果它是一个小图像(低于5KB),您可以使用Base64将原始数据编码为图像的内联
data:
URI

否则,您将需要编写一个只提供图像数据的新控制器操作。记住也要设置正确的内容类型。将记录键作为URI参数传入

[Route("/record-images/{recordPrimaryKey}")]
public async Task<IActionResult> GetImage( Int32 recordPrimaryKey )
{
    using( SqlConnection c = ... )
    using( SqlCommand cmd = c.CreateCommand() )
    {
        cmd.CommandText = "SELECT ..."; // I assume the raw file data is returned through `SqlDataReader`. I assume that FILESTREAM is just a back-end storage concern.
        using( SqlDataReader rdr = await cmd.ExecuteReaderAsync() )
        {
            if( !rdr.Read() ) return this.NotFound();

            Byte[] imageData = rdr.GetBytes( 0 );
            String contentType = rdr.GetString( 1 );
            return this.File( imageData, contentType );
        }
    }
}
[Route(“/record images/{recordPrimaryKey}”)]
公共异步任务GetImage(Int32 recordPrimaryKey)
{
使用(SqlConnection c=…)
使用(SqlCommand cmd=c.CreateCommand())
{
cmd.CommandText=“SELECT…”;//我假设原始文件数据是通过“SqlDataReader”返回的。我假设FILESTREAM只是一个后端存储问题。
使用(SqlDataReader rdr=await cmd.ExecuteReaderAsync())
{
如果(!rdr.Read())返回此.NotFound();
Byte[]imageData=rdr.GetBytes(0);
String contentType=rdr.GetString(1);
返回此.File(imageData,contentType);
}
}
}

非常感谢,我还没有尝试过,但我认为这会奏效,可能是最简单的答案。但是,在我把这个标记为正确答案之前,你能想到其他的方法吗?我之所以这么问,主要是因为这在网络世界中是一件很常见的事情(从数据库中提供图像),我希望会有一个“经过测试的,“预写”解决方案,无需我编写这样的自定义代码。@Lukeburne在普通web应用程序中,您通常将图像文件的URI存储在数据库中,图像文件存储在CDN或blob存储帐户(S3、Azure blob等)或web服务器自己的文件系统中,并作为静态文件使用。一般来说,不建议在关系数据库中存储大blob,尽管我知道
FILESTREAM
的情况有所不同。我个人仍然不会做你正在做的事情。我喜欢使用文件流的想法,因为我真的想把数据库中的记录与实际系统上的文件紧密地结合起来。然而,如果它以您描述的方式松散耦合(您只存储URI),则意味着有2个维护点,DB永远无法保证物理文件的状态。你个人会怎么做?@Lukeburne我个人出于经济和实际的原因使用blob存储。根据我的经验,对于文件丢失或不同步的风险的担忧是言过其实的,特别是如果您实施了良好的信息安全并进行了备份。将blob存储在数据库之外的主要原因是经济的:blob存储每GB非常便宜,而关系存储要昂贵得多。也不能保证另一个RDBMS产品将具有类似的功能。我在RDBMS中存储blob的唯一时间是它是否小于几千字节。好的,非常感谢,我会将此标记为正确答案,但我会接受你所说的,并做更多的研究,谢谢!