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
的控制器上的动作。
另一种选择是嵌入图像,如果这是你想要的。
然后你必须像这篇文章那样编码你的图像: 将图像路径转换为base64字符串,但使用你的内存流而不是从文件路径读取。