У меня есть простая форма, которая загружает изображение в базу данных.Используя действие контроллера, изображение может быть затем возвращено (я жестко запрограммировал использование 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");
}
}