Mvc Release Кандидат "Файл" ActionResult - PullRequest
0 голосов
/ 01 февраля 2009

К ... Я делаю что-то явно не так. У меня есть простая страница с контролем ввода файлов и кнопкой отправки. Я пробую новый "File" ActionResult, который был выпущен с Mvc RC ...

Все, что я хочу, это чтобы при нажатии кнопки «Отправить» выбранный файл загружался в базу данных. Это все отлично работает ...

Затем, после обновления страницы, я хочу, чтобы изображение отображало полученное изображение, которое было загружено. Проблема в том, что изображение не отображается ... Я получаю сломанное изображение ...

Это часть, которая получает файл и отправляет его обратно в представление ...

        var a = Helper.Service.GetAttachmentById(id, MembershipProvider.SecurityTicket);

        if (a == null)
        {
            return View(new ImagePlaceHolderViewData(new { Id = id }));
        }
        return View(new ImagePlaceHolderViewData(new { Id = a.Id, Image = a, FileContent = File(a.Data, a.ContentType) }));

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

<img src="<%=Model.FileContent.FileContents %>" />

Я тоже пытался ...

<img src="<%=Model.FileContent%>" />

Мысли .. ??

Ответы [ 3 ]

7 голосов
/ 01 февраля 2009

FileResult возвращает ASCII или двоичное содержимое файла. Когда вы говорите, сделайте следующее:

<img src="<%=Model.FileContent.FileContents %>" />

Вы пытаетесь вставить данные двоичного изображения в атрибут src. Это никогда не сработает, потому что src должен иметь URL или путь к изображению.

Есть несколько способов сделать то, что вы хотите, и наиболее правильным решением в этом случае будет создание нового контроллера, который возвращает двоичные данные, как вы пытаетесь, и затем вы устанавливаете атрибут src как путь к корректным действиям на вашем новом контроллере. Например:

<img src="/image/result/12345" />

Это указывает на следующий (действительно простой и неполный) пример контроллера:

public class ImageController : Controller
{
    public ActionResult Result(int resultID)
    {
        // Do stuff here...

        return File(..);
    }
}

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

3 голосов
/ 01 февраля 2009

Я думаю, это довольно просто: для атрибута src вашего тега img требуется URL. Здесь вы просто помещаете туда объект FileStream (который неявно вызывает метод ToString для этого объекта). Ваш получившийся html, вероятно, выглядит примерно так:

<img src="FileStream#1" />

Вы проверили свой источник HTML?

Что вы, вероятно, должны сделать, это предоставить метод, который возвращает данные и передает маршрут к вашему представлению. Получившийся HTML-код должен выглядеть примерно так:

<img src="/Images/View/1" />

Итак, шаги, которые вы должны сделать:

  • Создайте метод на вашем контроллере, который возвращает FileContentResult
  • Передайте изображение для вашего вида
  • Используйте Url.RouteUrl для генерации URL-адреса, который вы можете поместить в тег img, который указывает на метод, возвращающий данные вашего изображения.
1 голос
/ 03 февраля 2009

Есть и другое решение: </p> <pre><code><img src="data:image/gif;base64,<%=Convert.ToBase64(Model.FileContent)%>"/>

который работает в некоторых браузерах и не работает в некоторых браузерах (IE! конечно). Но стабильное решение - это то, что упомянул Томас Дж.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...