2016-06-21 5 views
3

フィールドデータ型がのSQLテーブルに格納されています。varbinary(max)イメージコンテンツタイプも保存します。ASP.NET Core MVC、データベースからファイルを取得し、イメージとしてレンダリングする

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; 
     } 
    } 
} 

これらは私の関数です:

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<FileModel>("GetFile", dynamicParameters, commandType: CommandType.StoredProcedure).FirstOrDefault(); 
     Stream stream = new MemoryStream(result.FileData); 
     return new FileStreamResult(stream, result.FileType); 
    } 
} 

私は、構文のこの種でこれを呼び出す:

<img src="@fileExtensions.GetFile(content.FileID)" /> 

私は取得しています私がこれを試してみると、404の応答は、明らかに何かが間違っています。これを実装しています。

答えて

7

以下のコードは頭の上から外れているので、いくつかの調整が必要な場合がありますが、基本的な考え方があります。

新しいコントローラを作成し、そこにあなたの方法を置く:

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<FileModel>("GetFile", dynamicParameters, commandType: CommandType.StoredProcedure).FirstOrDefault(); 
      Stream stream = new MemoryStream(result.FileData); 
      return new FileStreamResult(stream, result.FileType); 
     } 
    } 
} 

を、あなたのマークアップでは、コントローラを参照:

<img src="@Url.Action("GetFile", "Image", new {FileId = content.FileID})" /> 
2

@ fileExtensions.GetFile(content.FileID)は実際にはFileStreamResultを返します。これはhtml内でレンダリングできず、たぶんFileStreamResult.ToString()を返します。

レンダリングされたhtmlをチェック!

代わりに、FileStreamResultを返すコントローラでアクションをトリガーするurlをレンダリングする関数を使用します。

もう1つの方法は、画像が必要な場合に埋め込むことです。

<img alt="Embedded Image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA..." /> 

次にあなたがこの記事のように自分の画像をエンコードする必要があります。Convert image path to base64 stringが、ファイルパスから読み込むのではなく、あなたのメモリストリームを使用します。

関連する問題