5

byte[]アップロードされた画像を(Entityフレームワークを使用して)データベースに保存し、表示するASP.NET MVC4アプリケーションをプログラミングしています。ビューでこのコードを使用している画像を表示するには:

<img src="data:image;base64,@System.Convert.ToBase64String(item.ImageByte)" alt=""/>

しかし、ページを更新するたびに、ブラウザが画像をキャッシュせず、再度レンダリングするだけで、帯域幅が不必要に使用されることがわかります。

たぶん、画像を表示するためのより帯域幅に優しい方法がありますか? アップロードされた画像を「byte[]」として保存するという考えは、そもそもばかげていたのかもしれません(私のアプリケーションは、心理学に関する記事を保存する単純なWebページです:Dこれを実現するための管理パネルを備えています)。フォルダー?

ありがとう

4

3 に答える 3

5

イメージをデータベースに保存することは、可能なオプションの 1 つです。良い考えの時もあれば、悪い考えの時もあります。一般に、大量または大きなサイズの画像を扱う場合は、別の保存方法を使用することを再検討することをお勧めします。

現在実際に行っていることは、画像を HTML に埋め込むことです。これは良いことです。グラフのデータを計算するのに約5秒かかり、ページにも同じデータが必要な場合に使用したことがありますが、一般的な使用法では、アクションから画像を提供する方がよいでしょう.

そのため、コントローラーで画像を取得するためのアクションを提供する必要があります。おそらくIDに基づいていますが、それはあなたに任せます.

[OutputCache(Duration = 3600, VaryByParam = "id")]
public ActionResult GetImage(int Id)
{
    // 1. provide connection to entity framework
    var dbc = new DatabaseContext();
    var item = dbc.FindItem(Id);// call to get the image from EF (2)
    var ms = new MemoryStream(tem.ImageByte);    
    FileStreamResult result = new FileStreamResult(ms, "image/png");
    result.FileDownloadName = item.ImageName; // or item.Id or something (3)
    return result;
}

cshtmlで

<img src="@Url.Action("GetImage", "Controller", new {Id = Model.ImageId})" />

したがって、上記のコードでは、提供する必要があります

  1. EFとのつながり
  2. 画像を見つけるための呼び出し
  3. イメージ名の何か
  4. おそらく出力キャッシュを変更します
于 2013-08-09T21:05:18.787 に答える
3

HomeController次のような関数を追加します。

[HttpGet]
public FileResult GetImage(string id)
{
    byte[] fileContents = ...; // load from database or file system
    string contentType = "image/jpeg";
    return File(fileContents, contentType);
}

でこのハンドラへのルートを登録しGlobal.asax.csます。

routes.MapRoute(
    "GetImage",
    "img/{id}",
    new { controller = "Home", action = "GetImage" });

srcWeb ページで、次のアクションへのポインタを使用します。

<img src="@Url.Action("GetImage", "Home", new { id = "logo.jpg" })" />

これはに解決されます

<img src="/img/logo.jpg" />
于 2013-08-09T21:06:15.693 に答える