ASP.NET MVC4 を使用して画像をアップロード/表示する Web サイトを構築していますが、画像を表示する方法がいくつか見つかりました。主に以下のとおりです。
1)画像をファイルとしてサーバーにローカルに保存し、相対パスを使用してページに表示します。
//ImageFile is a property which holds a path to the image in the model
<img src="@item.ImageFile" />
When the page is rendered, this becomes a path like - <img src="/Content/Images/Jellyfish.jpg" />
2)画像をバイト配列として保存し、コントローラ アクションを使用して取得します -
//Use a controller action (GetImg) to get the URL of the image
<img src="@Url.Action("GetImg", "ViewPhotos", new { id = item.ID })" alt="Image" />
When the page is rendered, this becomes a path like - <img src="/ViewPhotos/GetImg/4" alt="Image" />
3)画像をバイト配列として保存し、ビューで直接取得します-
//Directly re-construct the image in the view from the byte array (Image property of the model)
<img src="@String.Format("data:image/jpg;base64,{0}", Convert.ToBase64String(item.Image))" />
When the page is rendered, this becomes a path like - <img src="data:image/jpg;base64,/9j/4AAQSkZJRgABAgEA....<long string> .../>
私の質問は -
1) 1 と 2 の違いは何ですか?
1 はファイルへのパスを直接提供し、2 はファイルへの URL を提供します。それらはバックグラウンドで同じですか、それとも一方のアプローチが他方よりも優れていますか?
ここで確認したところ、Url.Action はアクションへのパスを構築し、アクションの実行結果ではなく、URL を返します。では、結果はいつ取得されますか?
2) 1 または 2 に対して 3 を使用すると、パフォーマンスに影響がありますか?
3) 画像サイズが小さい場合 (1MB 未満) と大きい場合、どちらのアプローチを使用する必要がありますか?
参考になるリンクがあれば教えていただけると幸いです。ありがとう。
コード -
//モデル
public class Photo
{
public int ID { get; set; }
public string ImageFile { get; set; }
public byte[] Image { get; set; }
public string Caption { get; set; }
}
//コントローラ
public FileContentResult GetImg(int id)
{
byte[] byteArray = db.Photos.Find(id).Image;
if (byteArray != null)
{
return new FileContentResult(byteArray, "image/jpeg");
}
else
{
return null;
}
}
//表示 (アプローチ 2)
@model IEnumerable<MyPhotoLibrary.Models.Photo>
@foreach (var item in Model) {
<tr>
<td>
<img src="@Url.Action("GetImg", "ViewPhotos", new { id = item.ID })" alt="Image" />
</td>
</tr>
}
//表示 (これはアプローチ 3 です)
@model IEnumerable<MyPhotoLibrary.Models.Photo>
@foreach (var item in Model) {
<tr>
<td>
<img src="@String.Format("data:image/jpg;base64,{0}", Convert.ToBase64String(item.Image))" />
</td>
</tr>
}