0

画像データをモデルに保存し、それをビューで取得する最良の方法を探しています。

現時点で私は持っています:

public class Product
{
  public int Id { get; set; }
  public byte[] Image { get; set; }
}

それから私はコントローラーを持っています

public class ProductController
{
  public ActionResult List()
  {
    return View(Repository.GetAll())
  }
  public FileContentResult GetImage(int id)
  {
    Product p = Repository.GetById(id);
    return new FileContentResult(p.Image, "image/jpeg");
  }
}

ビュー...

@model IEnumerable<Product>
@foreach(var product in Model)
{
  <img src="@Url.Action("GetImage", "Person", new { id = item.Id })" alt="Person Image" />
}

何が起こるかというと、リストに商品が増えるにつれて、画像が瞬時に読み込まれるように画面上で点滅し始めます.

私はAzureに公開しているので、新しい製品を追加するたびにWebサイトを公開する必要があるため、変更byte[]stringて文字列を調べることはできません(私の知る限り)。~/Images/ProductImage.jpeg

これを行う別の方法、またはビュー上の画像が徐々に表示され、瞬時ではなく次々と点滅する理由を探しているだけですか?

4

2 に答える 2

1

これを行う方法の 1 つは、バイト配列から直接画像を表示することです。

<img src="data:image/png; base64, @Convert.ToBase64String(product.Image)">

小さな画像で動作するはずです。data/png と data/jpg などを区別できるように、画像 MIME を保存することもできます。

ビューに送信されるモデルの一部になるため、これにより画像がすぐに読み込まれます。

于 2013-06-06T14:44:49.527 に答える
1

ブラウザは画像ごとにサーバーに戻る必要があるため、画像は瞬時ではなく「フラッシュ」します。多くのブラウザーでは、一度に開くことができる追加のリンク (css ファイル、js ファイル、画像ファイルなど) の数に制限があります。そのため、画像がすぐに表示されません。

あなたができること:

  • 画像が頻繁に変更されない場合は、アクション[OutputCache(...)]に属性を追加してくださいGetImage。このようにして、画像はサーバーやクライアントにキャッシュされ、読み込みが速くなります。
  • ファイルをデータベースではなくサーバーにローカルに保存します。これにより、IIS は静的ファイルとしてファイルに直接アクセスし、MVC パイプラインを回避できます。
  • ファイルをデータベースに保持しますが、データベースからファイルを取得するときに、サーバー (たとえば、App_Data の下) にキャッシュします。これにより、データベースへのアクセスが回避されます。

編集:

  • パブリックにアクセス可能な (または半パブリックな) Azure BLOB にイメージ ファイルを格納します。srcimgタグは、アクセスのために blob を直接指します。
于 2013-06-06T14:42:13.193 に答える