Отображение изображения из базы данных в asp mvc - PullRequest
60 голосов
/ 19 мая 2009

Я получаю изображение в формате байтового массива из контроллера. Как я могу отобразить это в виде? самым простым способом.

Ответы [ 6 ]

117 голосов
/ 19 мая 2009

Создайте контроллер для отображения изображений с помощью действия Показать, которое получает идентификатор изображения для отображения из базы данных. Действие должно вернуть FileResult, который содержит данные изображения с соответствующим типом содержимого.

public class ImageController : Controller
{
    public ActionResult Show( int id )
    {
        var imageData = ...get bytes from database...

        return File( imageData, "image/jpg" );
    }
}

По вашему мнению, создайте изображение и используйте идентификатор изображения, чтобы построить путь для изображения, используя контроллер и действие.

<img src='<%= Url.Action( "show", "image", new { id = ViewData["imageID"] } ) %>' />
9 голосов
/ 25 декабря 2013

Принятый ответ использования этого:

<img src='<%= Url.Action( "show", "image", new { id = ViewData["imageID"] } ) %>'

хорошо, но устарело для mvc 4. Обновленный синтаксис должен теперь читать:

<img src='@Url.Action( "show", "image", new { id = ViewData["imageID"] })' />

Кроме того, я обнаружил, что когда мне нужна эта функция, я уже передаю другие данные в представление, поэтому лучше использовать Модель вместо ViewData.

public class MyModel {
    public string SomeData {get;set;}
    public int FileId {get; set;}
}

С вашего контроллера:

public ActionResult Index() {
    MyEntity entity = fetchEntity();

    MyModel model = new MyModel {
        SomeData = entity.Data,
        FileId = entity.SomeFile.ID
    };

    return View(model);
}

Наконец, с вашей точки зрения:

<img src='@Url.Action("show", "image", new { id = Model.FileId })' />

Метод «Показать» на контроллере для принятого ответа будет работать, но я бы изменил жестко закодированный «image / jpg» для использования File.ContentType - вы можете сохранить его вместе с байтом [], так что вам не нужно угадать, загружают ли пользователи свои изображения.

4 голосов
/ 14 августа 2009

Я знаю, что это сообщение довольно старое, но оно было одним из первых, которое появилось, когда я пытался выяснить, как это сделать, по большей части ответ Авги был правильным, но большинство сборок устарели

  1. i download mvc2 preview 1

  2. не нужно беспокоиться о материале microsoft.web.mvc, я все равно не смог найти ничего из этого и искал около часа, пытаясь выяснить, во что это превратилось

это код, который я написал, который работает для меня для отображения изображения из поля базы данных типа image

в моем классе контроллера, который я назвал store, у меня есть это

public ActionResult GetImage(int id)
{
    byte[] imageData = storeRepository.ReturnImage(id);

    //instead of what augi wrote using the binarystreamresult this was the closest thing i found so i am assuming that this is what it evolved into 
    return new FileStreamResult(new System.IO.MemoryStream(imageData), "image/jpeg");
}

//in my repository class where i have all the methods for accessing data i have this

public byte[] ReturnImage(int id)
{
    // i tried his way of selecting the right record and preforming the toArray method in the return statment 
    // but it kept giving me an error about converting linq.binary to byte[] tried a cast that didnt work so i came up with this
    byte[] imageData = GetProduct(id).ProductImage.ToArray();
    return imageData;
}

Теперь для моей страницы просмотра я попробовал все способы, которые я нашел в этих формах, и ничего не получилось, я предполагаю, что они просто устарели, поэтому я примерил прихоть самое простое из всех, что я мог придумать, и это сработало отлично

<image src='/store/getimage/<%= Html.Encode(Model.productID) %>' alt="" />

Я продолжал получать сообщение об ошибке по поводу размещения тегов img, поэтому убедитесь, что вы изменили изображение выше на img

надеюсь, что это поможет кому-нибудь весь день охотиться за текущим ответом

http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=30886

2 голосов
/ 15 марта 2019

Каждый ответ здесь может быть правильным, но, по моему мнению, самый простой способ - получить массив байтов или модель, содержащую изображение, и просто добавить вот так

<img  src="data:image/jpeg;base64,@(Convert.ToBase64String(Model.Picture))">
2 голосов
/ 01 декабря 2011
public ActionResult EmployeeImage(int id)
{
    byte[] imageData ="Retrieve your Byte[] data from database";
    if (imageData!= null && imageData.Length > 0)
    {
        return new FileStreamResult(new System.IO.MemoryStream(imageData), "image/jpeg");
    }
}
0 голосов
/ 19 мая 2009

Предполагая, что у вас есть dataRow (dr) с двумя столбцами, "name" и "binary_image" (binary_image содержит двоичную информацию)

 Byte[] bytes = (Byte[])dr["Data"];
 Response.Buffer = true;
 Response.Charset = "";

 Response.Cache.SetCacheability(HttpCacheability.NoCache);
 Response.ContentType = dr["Image/JPEG"].ToString();

 Response.AddHeader("content-disposition", "attachment;filename=" & dt.Rows[0]["Name"].ToString());

 Response.BinaryWrite(bytes);
 Response.Flush();
 Response.End(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...