2009-03-10 5 views
2

Je maintiens une application qui a une page .aspx qui charge sur l'image de la base de données et utilise Response.BinaryWrite() pour l'écrire au client. Cela a fonctionné parfaitement il n'y a pas longtemps. Deux choses ont changé, nous avons mis à jour l'application vers .NET 3.5 et ils ont mis à niveau tous les ordinateurs au travail à IE7..aspx page Image Response.BinaryWrite sur IE7

Tout fonctionne bien sur Firefox, mais tout ce que je reçois dans IE7 est un X rouge. Donc je suppose que ce problème est lié à IE7? Y at-il un paramètre de sécurité quelque part qui l'empêcherait de charger des images à partir d'un formulaire .aspx? Il est déjà configuré pour s'afficher en fonction du type de contenu et non de l'extension.

Voici une partie du code. Comme je l'ai dit, je maintiens juste cette application et je ne l'ai pas écrite. Je sais que l'utilisation de Session n'est pas une excellente façon de le faire, mais c'est ce que j'ai et l'instruction switch est juste un "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:

OK, je l'ai suivi vos suggestions et par un peu plus de recherches que j'ai changé la méthode pour ce qui suit, mais il ne fonctionne toujours pas.

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

Répondre

0

L'image a été corrompue d'une manière que IE7 ne pouvait pas l'afficher, mais Firefox pourrait. L'image était grande, elle ne cadrait pas avec l'écran et je ne voyais pas où elle était coupée.

Merci pour toutes vos suggestions.

0

Vous pouvez essayer un ...

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

... juste avant ...

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

Nous avons dû faire pour obtenir l'association de type de fichier correct dans IE7 .

0

Essayez de régler votre disposition de contenu à inline au lieu d'attachement, comme:

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

Alors que la plupart des navigateurs sont très flexibles à cet égard, a pour but « attachement » à exiger de nouvelles mesures par l'utilisateur. IETF RFC 1806:

L'affichage d'une pièce jointe est généralement pour effet d'exiger action positive de la part du destinataire , lorsque le message en ligne composants sont affichés automatiquement lorsque le message est affiché.

2

Vos types mime ne sont pas corrects. Cela fonctionne mieux, au moins pour les images:

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 sont des types MIME et les extensions de fichiers, si vous avez besoin d'ajouter plus: http://www.w3schools.com/media/media_mimeref.asp

0

Procurez-vous une copie de Fiddler afin que vous puissiez voir ce que le réponse à l'URL de l'image est.

Si possible, remplacez l'ASPX par un ASHX à la place.

1

Je peux vous dire que cette façon de chargement d'image fonctionne très bien dans IE7 (juste écrit le même code sorta il y a quelque temps). Donc, il pourrait y avoir des problèmes suivants: 1) Essayez de faire un Response.Clear() avant de définir le ContentyType et de faire un response.end à la fin. 2) Assurez-vous que votre extension dans la session est sans la période (.) I.e.il doit être juste gif pour Gifs, jpg pour .jpg, etc.

S

0

Essayez d'aller vers un autre site dans IE7.
Affiche-t-il les images de tout autre site Web?

Si les images ne s'affichent pas, je suppose que vous avez peut-être des paramètres (par exemple, la barre d'outils du développeur Web ou le fiddler) pour «ne pas charger les images».

0

Votre code est très compliqué, pourquoi ne pas le simplifier un peu, de sorte que vous ne définissez que le type de contenu?

Voici le code que j'utilise, et il fonctionne dans tous les navigateurs.

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

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

Envisagez de configurer votre page avec un cache, y compris des en-têtes de contrôle de cache côté client. Lorsque vous faites cela assurez-vous que vous définissez un nom différent pour chaque image individuelle

contentDisposition = String.Format("attachment; filename=content{0).{1}",fileName, fileExtension); 

et les en-têtes de cache côté client

context.Response.Cache.SetMaxAge(TimeSpan.FromSeconds(YourDatabaseImageOrConfigFile.CacheSeconds)); 
context.Response.Cache.SetOmitVaryStar(true); 
context.Response.Cache.SetLastModified(YourDatabaseImage.ModifiedDate); 

Je voudrais faire cette page dans un gestionnaire de http ASHX et d'obtenir débarrasser de la surcharge du cycle de vie de la page.

J'ai tout écrit à plusieurs reprises et je peux fournir le code si nécessaire. Ce point de terminaison d'image est sur un site faisant environ 80 demandes par seconde.

0

Je ne suis pas sûr à 100% sur IE7, mais j'ai rencontré un problème similaire avec IE8. La solution à mon problème était de m'assurer que j'avais couvert le type de contenu pour "image/pjpeg". Je ne sais pas combien de couvertures différentes vous avez besoin, mais celui-ci a résolu mon problème.

Questions connexes