Сохранение / отображение изображения в asp.net MVC - PullRequest
2 голосов
/ 07 марта 2012

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

Изображение либо неправильно сохраняется, либо извлекается из базы данных правильно, так как во время записи / извлечения байтов изображение недопустимо. При сравнении размера загруженного изображения с оригиналом размер отличается (больше)?

Модель

public byte[] Photo { get; set; }
public string PhotoMimeType { get; set; }
public string PhotoName { get; set; }

Sql Server :

[PhotoMimeType] [nvarchar](50) NULL,
[PhotoName] [nvarchar](50) NULL,
[Photo] [image] NULL,

В контроллере у меня есть следующее для сохранения изображения :

public ActionResult Edit(AgentInfo modifiedAgent, HttpPostedFileBase postedFile)
{
    if(ModelState.IsValid)
    {
        var model = _agentRepository.GetByID(modifiedAgent.AgentID);
        if (TryUpdateModel(model))
        {
            if (postedFile != null)
            {
                int imageLength = postedFile.ContentLength;
                byte[] imgBytes = new byte[imageLength];
                postedFile.InputStream.Read(imgBytes, 0, imageLength);

                model.PhotoMimeType = postedFile.ContentType;
                model.PhotoName = postedFile.FileName;
                model.Photo = imgBytes;
            }
            _agentRepository.Save(model);
            return RedirectToAction("ManageAgents", "Agent");  
        }
    }

    return View("Edit", modifiedAgent);
}

Поиск :

[HttpGet]
public ActionResult GetImage(int id)
{
    var agent = _agentRepository.GetByID(id);
    return File(agent.Photo, agent.PhotoMimeType, agent.PhotoName);
}

Дисплей :

<img src='@Url.Action("GetImage", "Agent", new { id = Model.AgentID })' />

EDIT:

Ну, подумав, что это была проблема с тем, как я все это проводил, оказалось, что это сопоставления моей базы данных ..... frick

Кстати, если при отображении с помощью fluent-nhibernate требуется сохранить байты изображения, тип данных sql является varbinary (max) со следующим отображением:

Map(x => x.Photo).Column("Photo").Length(2147483647).CustomSqlType("varbinary(MAX)");

1 Ответ

4 голосов
/ 07 марта 2012

Попробуйте перемотать InputStream непосредственно перед его чтением:

postedFile.InputStream.Position = 0;

или используйте временную MemoryStream:

using (var memoryStream = new MemoryStream())
{
    postedFile.InputStream.CopyTo(memoryStream);
    model.Photo = memoryStream.ToArray();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...