.ответ на странице aspx.Изображения BinaryWrite на IE7
Я поддерживаю приложение, которое имеет a .aspx-страница, которая загружается на изображение из базы данных и использует ответ.BinaryWrite (), чтобы записать его обратно клиенту. Совсем недавно это сработало идеально. Две вещи изменились, мы обновили приложение до .NET 3.5, и они обновили все компьютеры на работе до IE7.
Все отлично работает в Firefox, но все, что я получаю в IE7-это красный X. Поэтому я предполагаю, что эта проблема связана с IE7? Есть ли где-нибудь установка безопасности, которая остановила бы его от загрузка изображения из .форма aspx? Он уже настроен для отображения на основе типа контента, а не расширения.
Вот некоторые из кодов. Как я уже сказал, я просто поддерживаю это приложение и не писал его. Я знаю, что использование сеанса-не лучший способ сделать это, но это то, что у меня есть, и оператор switch-это просто " wtf?".
<asp:image id="imgContent" runat="server" Visible="true" ImageUrl="ProductContentFormImage.aspx"></asp:image>
protected void Page_Load(object sender, System.EventArgs e)
{
Hashtable hshContentBinary = (Hashtable)Session["hshContentBinary"];
byte[] content = (byte[]) hshContentBinary["content"];
string extension = (string) hshContentBinary["extension"];
string contentTypePrefix = "application";
switch(extension.ToLower())
{
case "gif":
case "jpg":
case "bmp":
contentTypePrefix = "image";
break;
case "tif":
contentTypePrefix = "image";
break;
case "tiff":
contentTypePrefix = "image";
break;
case "eps":
contentTypePrefix = "image";
break;
default:
Response.AppendHeader(
"Content-disposition",
"attachment; filename=content." + extension );
break;
}
Response.ContentType = contentTypePrefix + "/" + extension;
Response.BinaryWrite(content);
}
Правка:
Хорошо, я последовал вашим предложениям и через небольшое исследование я изменил метод на следующий, но он все еще не работает. работа.
protected void Page_Load(object sender, System.EventArgs e)
{
Hashtable hshContentBinary = (Hashtable)Session["hshContentBinary"];
byte[] content = (byte[]) hshContentBinary["content"];
string extension = (string) hshContentBinary["extension"];
string contentType;
string contentDisposition = "inline; filename=content." + extension;
Response.ClearContent();
Response.ClearHeaders();
Response.Clear();
switch(extension.ToLower())
{
case "gif":
contentType = "image/gif";
break;
case "jpg":
case "jpe":
case "jpeg":
contentType = "image/jpeg";
break;
case "bmp":
contentType = "image/bmp";
break;
case "tif":
case "tiff":
contentType = "image/tiff";
break;
case "eps":
contentType = "application/postscript";
break;
default:
contentDisposition = "attachment; filename=content." + extension;
contentType = "application/" + extension.ToLower();
break;
}
Response.Buffer = true;
Response.Expires = 0;
Response.ContentType = contentType;
Response.AddHeader("Content-Length", content.Length.ToString());
Response.AddHeader("Content-disposition", contentDisposition);
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.BinaryWrite(content);
Response.End();
}
10 ответов:
Ваши типы mime неверны. Это работает лучше, по крайней мере, для изображений:
string contentType = "application/" + extension.ToLower(); switch(extension.ToLower()) { case "gif": contentType = "image/gif"; break; case "jpg": case "jpeg": case "jpe": contentType = "image/jpeg"; break; case "bmp": contentType = "image/bmp"; break; case "tif": case "tiff": contentType = "image/tiff"; break; case "eps": contentType = "application/postscript"; break; default: Response.AppendHeader( "Content-disposition", "attachment; filename=content." + extension ); break; } Response.ContentType = contentType;
Hera - это типы mime и расширения файлов, Если вам нужно добавить еще: http://www.w3schools.com/media/media_mimeref.asp
Я могу сказать вам, что этот способ загрузки изображений отлично работает в IE7 (только что написал тот же код sorta некоторое время назад). Таким образом, могут возникнуть следующие проблемы: 1) Попробуйте сделать ответ.Очистите () перед установкой ContentyType и выполните ответ.конец в конце концов. 2) Убедитесь,что ваше продление в сессии без периода (.) то есть это должен быть просто gif для .gif, jpg для .JPG и т. д.
S
Рассмотрите возможность настройки страницы с некоторым кэшированием, включая заголовки управления кэшированием на стороне клиента. При этом убедитесь, что для каждого отдельного изображения задано другое имя файла
contentDisposition = String.Format("attachment; filename=content{0).{1}",fileName, fileExtension);
И заголовки кэша на стороне клиента
context.Response.Cache.SetMaxAge(TimeSpan.FromSeconds(YourDatabaseImageOrConfigFile.CacheSeconds)); context.Response.Cache.SetOmitVaryStar(true); context.Response.Cache.SetLastModified(YourDatabaseImage.ModifiedDate);
Я бы сделал эту страницу обработчиком HTTP ASHX, чтобы избавиться от накладных расходов жизненного цикла Страницы.
Я написал все это несколько раз и могу предоставить код, если это необходимо. Эта конечная точка образа находится на сайте выполнение около 80 запросов в секунду.
Вы можете попробовать a...
Response.ClearContent(); Response.ClearHeaders();
...только что...
Response.ContentType = contentTypePrefix + "/" + extension;
Нам пришлось это сделать, чтобы получить правильную ассоциацию типов файлов в IE7.
Попробуйте установить content-disposition в inline вместо attachment, например:
Хотя большинство браузеров очень гибки в этом отношении, "вложение" было предназначено для того, чтобы потребовать дальнейших действий от пользователя. IETF RFC 1806:Response.AppendHeader( "Content-disposition", "inline; filename=content." + extension );
Отображение вложения является обычно истолковывается как требующий позитивные действия со стороны получатель, в то время как встроенное сообщение компоненты отображаются автоматически когда сообщение просматривается.
Возьмите себе копию Fiddler, чтобы вы могли видеть, каков ответ на URL-адрес изображения.
По возможности замените ASPX на ASHX.
Попробуйте перейти на другой сайт в IE7.
Показывает ли он изображения для любого другого веб-сайта?Если он не показывает изображения, я предполагаю, что у вас может быть какая-то настройка (например, панель инструментов веб-разработчика или скрипач), чтобы "не загружать изображения".
Ваш код очень сложен, почему бы не упростить его немного, чтобы вы только устанавливали тип контента?
Вот код, который я использую, и он работает во всех браузерах.
protected void Page_Load(object sender, EventArgs e) { byte[] jpg = ..... Response.Clear(); Response.ContentType = "image/jpeg"; Response.BinaryWrite(jpg); Response.End(); }