.ответ на странице 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 2

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, например:

Response.AppendHeader( 
   "Content-disposition",
   "inline; filename=content." + extension );
Хотя большинство браузеров очень гибки в этом отношении, "вложение" было предназначено для того, чтобы потребовать дальнейших действий от пользователя. IETF RFC 1806:

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

Возьмите себе копию 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();
}

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

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

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