.aspx page Response.BinaryWrite изображение на IE7 - PullRequest
2 голосов
/ 10 марта 2009

Я поддерживаю приложение, которое имеет страницу .aspx, которая загружает изображение из базы данных и использует Response.BinaryWrite (), чтобы записать его обратно клиенту. Это отлично сработало не так давно. Две вещи изменились, мы обновили приложение до .NET 3.5, и они обновили все компьютеры на работе до 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();
}

Ответы [ 10 ]

2 голосов
/ 10 марта 2009

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

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;

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

1 голос
/ 11 марта 2009

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

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

1 голос
/ 10 марта 2009

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

S

0 голосов
/ 08 февраля 2010

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

0 голосов
/ 07 апреля 2009

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

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

0 голосов
/ 11 марта 2009

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

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

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

  Response.Clear();
  Response.ContentType = "image/jpeg";
  Response.BinaryWrite(jpg);
  Response.End();
}
0 голосов
/ 11 марта 2009

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

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

0 голосов
/ 10 марта 2009

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

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

0 голосов
/ 10 марта 2009

Попробуйте установить расположение содержимого вместо встроенного, например:

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

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

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

0 голосов
/ 10 марта 2009

Вы можете попробовать ...

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

... прямо перед ...

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

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

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