ASP.NET Core MVC,从数据库获取文件,并呈现为图像

我将图像数据存储在SQL表中,字段类型为varbinary(max)我还存储图像内容类型。

使用Microsoft ASP.NET Core MVC和Dapper,我试图从数据库中恢复文件并将其渲染为图像。

这是我的FileModel

using System; namespace Brand.Models { public class FileModel { public Guid ID { get; set; } public string FileName { get; set; } public string FileType { get; set; } public byte[] FileData { get; set; } public int FileLength { get; set; } public long Version { get; set; } public string FileSource { get; set; } public DateTime Created { get; set; } public FileModel() { FileLength = 0; Version = 1; Created = DateTime.Now; } } } 

这些是我的function:

 public FileStreamResult GetFile(string FileID) { return GetFile(new Guid(FileID)); } public FileStreamResult GetFile(Guid FileID) { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); DynamicParameters dynamicParameters = new DynamicParameters(); dynamicParameters.Add(@"ID", FileID); FileModel result = connection.Query("GetFile", dynamicParameters, commandType: CommandType.StoredProcedure).FirstOrDefault(); Stream stream = new MemoryStream(result.FileData); return new FileStreamResult(stream, result.FileType); } } 

我用这种语法称之为:

  

当我尝试这个时,我得到了404响应,所以显然我实现这个的方式有问题。

下面的代码只是我的头脑,所以它可能需要一些调整,但它会给你基本的想法。

创建一个新的控制器并将您的方法放在那里:

 public ImageController : Controller { public FileStreamResult GetFile(string FileID) { return GetFile(new Guid(FileID)); } public FileStreamResult GetFile(Guid FileID) { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); DynamicParameters dynamicParameters = new DynamicParameters(); dynamicParameters.Add(@"ID", FileID); FileModel result = connection.Query("GetFile", dynamicParameters, commandType: CommandType.StoredProcedure).FirstOrDefault(); Stream stream = new MemoryStream(result.FileData); return new FileStreamResult(stream, result.FileType); } } } 

然后在你的标记中,引用控制器:

  

由于@fileExtensions.GetFile(content.FileID)实际上返回一个FileStreamResult ,它将无法在html中呈现它,并且可能只返回FileStreamResult.ToString()

检查渲染的HTML!

相反,你要做的是一个函数,它呈现一个url,它触发一个返回FileStreamResult的控制器上的动作。

另一种选择是嵌入图像,如果这是你想要的。

 Embedded Image 

然后你必须像这篇文章那样编码你的图像: 将图像路径转换为base64字符串,但使用你的内存流而不是从文件路径读取。