2009-03-10 1 views
2

Я поддерживаю приложение, в котором есть страница .aspx, загружающая изображение из базы данных и использующая Response.BinaryWrite(), чтобы записать его обратно клиенту. Это сработало совсем недавно. Две вещи изменились, мы обновили приложение до .NET 3.5, и они обновили все компьютеры, работающие на IE7..aspx page Response.BinaryWrite image on IE7

Все работает отлично на Firefox, но все, что я получаю в IE7, - это красный X. Поэтому я предполагаю, что эта проблема связана с IE7? Есть ли где-то параметр безопасности, который помешает ему загружать изображения из формы .aspx? Он уже настроен для отображения на основе типа контента, а не расширения.

Вот некоторые из кода. Как я уже сказал, я просто поддерживаю это приложение и не пишу его. Я знаю, что использование Session - отличный способ сделать это, но это то, что у меня есть, и оператор 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); 
    } 

EDIT:

ОК, я последовал за ваши предложения и через немного больше исследований я изменил метод к следующему, но он по-прежнему не работает.

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(); 
} 

ответ

0

Изображение было повреждено таким образом, что IE7 не смог его отобразить, но Firefox может. Изображение было большим, оно не поместилось на экран, и я не видел, где он был отрезан.

Спасибо за все ваши предложения.

0

Вы могли бы попробовать ...

Response.ClearContent(); 
Response.ClearHeaders(); 

... перед ...

Response.ContentType = contentTypePrefix + "/" + extension; 

Мы должны были сделать это, чтобы получить правильный тип файла ассоциации в IE7 ,

0

Попробуйте настроить контент-расположение встраивать вместо привязанности, как:

Response.AppendHeader( 
    "Content-disposition", 
    "inline; filename=content." + extension); 

В то время как большинство браузеров являются очень гибкими в этом отношении, «привязанность» должна была потребовать дополнительных действий со стороны пользователя. IETF RFC 1806:

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

2

Неверные тэги. Это работает лучше, по крайней мере, для изображений:

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; 

Гера являются мим типов и расширений файлов, если вам нужно добавить больше: http://www.w3schools.com/media/media_mimeref.asp

0

Получить себе копию Fiddler, так что вы можете увидеть, что ответ на URL-адрес изображения.

Если возможно, замените ASPX на ASHX.

1

Я могу сказать вам, что этот способ загрузки изображений отлично работает в IE7 (только что написал один и тот же код sorta некоторое время назад). Таким образом, могут возникнуть следующие проблемы: 1) Попробуйте выполнить Response.Clear() перед настройкой ContentyType и выполните команду response.end в конце. 2) Убедитесь, что ваше расширение в сеансе не имеет периода (.) I.e.это должно быть просто GIF для .gifs, JPG для .jpg и т.д.

S

0

Try собирается на другой сайт в IE7.
Показаны ли изображения для любого другого сайта?

Если он не отображает изображения, я предполагаю, что у вас может быть некоторая настройка (например, панель инструментов веб-разработчика или скрипка) для «не загружать изображения».

0

Ваш код очень сложный, почему бы не упростить его, так что вы устанавливаете только тип контента?

Вот код, который я использую, и он работает во всех браузерах.

protected void Page_Load(object sender, EventArgs e) 
{ 
    byte[] jpg = ..... 

    Response.Clear(); 
    Response.ContentType = "image/jpeg"; 
    Response.BinaryWrite(jpg); 
    Response.End(); 
} 
1

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

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 запросов в секунду.

0

Я не уверен на 100% относительно IE7, однако я столкнулся с аналогичной проблемой с ie8. Решение моей проблемы состояло в том, чтобы убедиться, что я рассмотрел тип контента для «image/pjpeg». Не знаете, сколько разных покрытий вам нужно, но это решило мою проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^