2013-03-18 2 views
3

У меня есть загрузка изображений в моей форме:MVC 3 Изображение не загружено

@using (Html.BeginForm("Create", "Application", FormMethod.Post, new { enctype = "multipart/form-data" })) 
    { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Application Under Testing</legend> 

     <div class="editor-label"> 
      Image 
     </div> 
     <div class="editor-field"> 
      @if (Model.AppDetails.Image == null) 
      { 
       @:None 
      } else { 
       <img width="400" src="@Url.Action("GetImage", "Application", new { Model.AppDetails.ID })" /> 
      } 
      <div>Upload new image: <input type="file" name="Image" /></div> 
     </div> 
    </fieldset> 
    } 

Это представляет его, и он будет сохранен в базе данных с помощью:

[HttpPost] 
    public ActionResult Create(ApplicationViewModel vm, HttpPostedFileBase image) 
    { 
     if (ModelState.IsValid) 
     { 
      if (image != null) 
      { 
       vm.AppDetails.ImageMimeType = image.ContentType; 
       vm.AppDetails.Image = new byte[image.ContentLength]; 
       image.InputStream.Read(vm.AppDetails.Image, 0, image.ContentLength); 
      } 

      _repository.SaveEntity<AUT>(vm.AppDetails); 

      return RedirectToAction("Index"); 
     } 

     return View(vm); 
    } 

Итак, теперь у меня есть действие, которое получает изображение из базы данных для отображения:

public FileContentResult GetImage(Guid appID) 
    { 
     var app = _repository.AUTs.FirstOrDefault(x => x.ID.Equals(appID)); 
     if (app == null) 
     { 
      return null; 
     } 

     return File(app.Image, app.ImageMimeType); 
    } 

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

<td> 
     @if (item.Image == null) 
     { 
      @:None 
     } else { 
      <img width="100" src="@Url.Action("GetImage", "Application", new { item.ID })" /> 
     } 
    </td> 

Выход на веб-странице это:

<img width="100" src="/Validation/Application/GetImage/bd3fdb5b-8d73-48e2-a04e-1a49a73729be"> 

Это не отображается изображение. EDIT: Я действительно проверил элемент в Chrome, и он имеет 2 ошибки (по 1 для каждого изображения): Ошибка 500 Внутренняя ошибка сервера. И он показывает URL-адрес для getimage, стоит ли использовать полный URL-адрес? или что-то?

Так что я предполагаю, что он либо не сохраняет правильные данные в базе данных, либо правильно считывает данные в формат изображения. Или где-то мой код неправильный.

Любые мысли?

--- EDIT ---

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

Таким образом, это должно быть связано с визуализацией его на стороне клиента, поскольку серверная сторона, похоже, работает нормально. Chrome показывает ошибку: 500 Внутренняя ошибка сервера.

+0

Вы отлаживали свой код? Что происходит в методе GetImage? Он находит изображение? – nemesv

+0

Ну что ж, я попытался поставить точку останова в получении изображения, он не попадет ... –

+0

Это может помочь: http://stackoverflow.com/questions/8474822/displaying-database-image-bytes- in-razor-mvc3 –

ответ

0

Итак, я нашел ответ на эту проблему, и останавливается спиной вызовов на сервер:

<img width="100" src="data:@item.ImageMimeType;base64,@(Convert.ToBase64String(item.Image))" /> 

Есть ли какие-либо проблемы с использованием этого, как и обратной совместимости со старыми браузерами? Или есть какая-то другая причина, почему я не должен использовать это?

Этот способ означает, что мне не нужно снова запрашивать базу данных для изображения.

0

Вы подтвердили, что файл на самом деле сталкивается? Недавно у меня была аналогичная ситуация, и я получил Request.Files, чтобы перейти к опубликованным файлам.

+0

Не могли бы вы рассказать об этом, как вы использовали запрос? –

+0

Да, изображение попадает на сервер. И изображения находятся в базе данных как действительно большие длинные шестнадцатеричные числа –

+0

Если изображение попадает на сервер, то это не ваша проблема. –

Смежные вопросы