У меня есть простая форма, которая загружает изображение в базу данных. Используя действие контроллера, изображение может быть возвращено (я жестко закодирован для использования jpeg для этого кода):
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 image/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" />
), ошибка не возникает.
РЕДАКТИРОВАТЬ. Это можно полностью воспроизвести без каких-либо из перечисленных действий:
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");
}
}