我正在使用 ASP.NET MVC4 构建一个网站来上传/显示图像,并找到了几种显示图像的方法,主要是以下 -
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) 当 3 用于 1 或 2 时,它会对性能产生影响吗?
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;
}
}
//查看(方法二)
@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>
}