Возвращение изображения из действия приводит к ошибке в FireBug / Chrome Dev. инструменты - PullRequest
13 голосов
/ 26 мая 2011

У меня есть простая форма, которая загружает изображение в базу данных.Используя действие контроллера, изображение может быть затем возвращено (я жестко запрограммировал использование jpegs для этого кода):

public class ImagesController : Controller
{
    [HttpPost]
    public ActionResult Create(HttpPostedFileBase image)
    {
        var message = new MessageItem();
        message.ImageData = new byte[image.ContentLength];
        image.InputStream.Read(message.ImageData, 0, image.ContentLength);
        this.session.Save(message);
        return this.RedirectToAction("index");
    }

    [HttpGet]
    public FileResult View(int id)
    {
        var message = this.session.Get<MessageItem>(id);
        return this.File(message.ImageData, "image/jpeg");
    }
}

Это прекрасно работает и напрямую просмотр к изображению(например, /images/view/1) правильно отображает изображение.Тем не менее, я заметил, что когда FireBug включен, меня приветствует прекрасная ошибка:

Изображение повреждено или обрезано: data: image / jpeg; base64, / f39 ... (затемпредставление base64 изображения).

Дополнительно в инструментах разработчика Chrome:

Ресурс интерпретируется как Документ, но передается с изображением MIME типа / jpeg.

Я проверил заголовки, которые возвращаются.Ниже приведен пример заголовков, отправленных обратно в браузер.Ничто не выглядит необычно (возможно, Cache-Control?):

Cache-Control       private, s-maxage=0
Content-Type        image/jpeg
Server              Microsoft-IIS/7.5
X-AspNetMvc-Version 3.0
X-AspNet-Version    4.0.30319
X-SourceFiles       =?UTF-8?B?(Trimmed...)
X-Powered-By        ASP.NET
Date                Wed, 25 May 2011 23:48:22 GMT
Content-Length      21362

Кроме того, я подумал, что упомяну, что я запускаю это на IIS Express (даже проверено на Cassini с теми же результатами)).

Странно то, что на изображении правильно отображается , но консоли говорят мне об обратном.В идеале я хотел бы не игнорировать эти ошибки.Наконец, чтобы еще больше добавить к путанице, при ссылке на изображение (например, <img src="/images/view/1" />) ошибка не возникает.

EDIT : можно полностью воспроизвести без любое из вышеперечисленных действий:

public class ImageController : Controller
{
    public FileResult Test()
    {
        // I know this is directly reading from a file, but the whole purpose is
        // to return a *buffer* of a file and not the *path* to the file.
        // This will throw the error in FireBug.
        var buffer = System.IO.File.ReadAllBytes("PATH_TO_JPEG");
        return this.File(buffer, "image/jpeg");
    }
}

Ответы [ 6 ]

3 голосов
/ 31 мая 2011

Вы предполагаете, что тип MIME всегда image / jpeg, и вы не используете тип MIME загруженного изображения.Я видел эти типы MIME, опубликованные различными браузерами для загруженных изображений:

  • image / gif
  • image / jpeg
  • image / pjpeg
  • image / png
  • image / x-png
  • image / bmp
  • image / tiff

Возможно, image / jpeg не правильныйТип MIME для файла и инструменты разработчика выдают предупреждение.

2 голосов
/ 01 июня 2011

Интересно, это как-то связано с X-SourceFiles.Я делаю то же самое, что и вы с MVC, но я сохраняю свой байтовый массив в базе данных.Единственное отличие, которое я не понимаю в наших заголовках, это X-SourceFiles.

Вот кое-что о том, что делает X-SourceFiles Что делает заголовок X-SourceFiles? и он говорито кодировании.Так что, может быть??Ответчик утверждает, что это происходит только на вашем локальном хосте.

Насколько я понимаю, если вы возвращаете правильный байтовый массив, который равен jpeg, то ваш код должно работать нормально.Это именно то, что я делаю успешно (без заголовка X-SourceFiles).

2 голосов
/ 29 мая 2011

Может быть, само изображение повреждено? Если вы сохраните его в виде файла на своем веб-сайте и получите прямой доступ к нему, появится ли ошибка? Как выглядит этот запрос по сравнению с вашим запросом в Fiddler? Возможно, браузеры пытаются получить тип контента по расширению, вы можете попробовать маршрут, подобный этому, чтобы увидеть, есть ли какие-либо изменения:

routes.MapRoute(
    "JpegImages",
    "Images/View/{id}.jpg",
    new { controller = "Images", action = "View" }
);

Еще одна вещь, чтобы проверить. image.InputStream.Read () возвращает целое число, которое является фактическим количеством прочитанных байтов. Возможно, что все байты не могут быть прочитаны одновременно, можете ли вы записать это и выдать ошибку, если числа не совпадают?

int bytesRead = image.InputStream.Read(message.ImageData, 0, image.ContentLength);
if (bytesRead != image.ContentLength)
    throw new Exception("Invalid length");
2 голосов
/ 26 мая 2011

Используйте Fiddler и сохраните этот файл на сервере.Попробуйте GET-запрос непосредственно к изображению.Затем попытайтесь получить метод действия.Сравните заголовки и контент fiddler (можете сохранить и сравнить с пробной версией BeyondCompare).Если бы они соответствовали обоим запросам на получение - ну ... это не имело бы смысла - в этом случае что-то изменилось бы и, надеюсь, укажет на проблему.Что-то должно быть по-другому - но, не видя выходной сигнал скрипача, трудно сказать:)

2 голосов
/ 26 мая 2011

Может ли быть так, что session.Save/Get усекает jpeg?

1 голос
/ 03 июня 2011

Спасибо всем за помощь.Я знаю, что это будет очень анти-климатическим окончанием этой проблемы, но я смог «решить» проблему.Я пытался собрать свой код с другого компьютера, используя те же версии браузера / Firebug.Как ни странно, никаких ошибок не появилось.Когда я вернулся на другую машину (очистил весь кэш и даже переустановил браузер / firebug), он все еще получал ошибку.Что еще более странно, так это то, что оба Chrome / Firefox теперь показывают ошибку, когда я посещаю другие веб-сайты.

Еще раз, спасибо всем за все их предложения!

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