2009-03-10 14 views
2

Ich verwalten eine Anwendung, die eine ASPX-Seite hat, die auf Bild aus der Datenbank geladen und Response.BinaryWrite() verwendet, um es zurück auf den Client zu schreiben. Dies hat vor nicht allzu langer Zeit perfekt funktioniert. Zwei Dinge haben sich geändert: Wir haben die Anwendung auf .NET 3.5 aktualisiert und alle Computer bei der Arbeit auf IE7 aktualisiert.ASPX-Seite Response.BinaryWrite Bild auf IE7

Alles funktioniert gut auf Firefox, aber alles, was ich in IE7 bekomme, ist ein rotes X. Also nehme ich an, dass dieses Problem mit IE7 verwandt ist? Gibt es irgendwo eine Sicherheitseinstellung, die das Laden von Bildern aus einem ASPX-Formular verhindern würde? Es ist bereits so eingestellt, dass es basierend auf dem Inhaltstyp und nicht auf der Erweiterung angezeigt wird.

Hier ist ein Teil des Codes. Wie gesagt, ich behalte diese App und habe sie nicht geschrieben. Ich weiß, dass die Verwendung von Session keine gute Möglichkeit ist, es zu tun, aber es ist was ich habe und die switch-Anweisung ist nur ein "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, folgte ich Ihre Vorschläge und durch ein wenig mehr Forschung habe ich die Methode in die folgenden geändert, aber es funktioniert immer noch nicht.

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

Antwort

0

Das Bild wurde so beschädigt, dass IE7 es nicht anzeigen konnte, aber Firefox konnte. Das Bild war groß, es passte nicht auf den Bildschirm und ich sah nicht, wo es abgeschnitten wurde.

Vielen Dank für Ihre Anregungen.

0

Sie könnten einen Versuch ...

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

... direkt vor ...

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

Wir hatten das zu tun, die richtige Dateitypzuordnung in IE7 zu bekommen . anstelle der Bindung an Inline, wie

0

Versuchen Sie, Ihre Content-Disposition Einstellung:

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

Während die meisten Browser sind sehr flexibel in dieser Hinsicht „attachment“ sollte durch den Benutzer weitere Maßnahmen erforderlich. IETF RFC 1806:

Die Anzeige einer Befestigung ist im allgemeinen positive Wirkung auf den Teil des Empfänger erfordern ausgelegt, während Inline-Nachricht Komponenten automatisch angezeigt werden, wenn die Nachricht angezeigt wird.

2

Ihre Mime-Typen sind nicht korrekt. Das funktioniert besser, zumindest für die Bilder:

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-Typen und Dateierweiterungen sind, wenn Sie mehr hinzufügen müssen: sich http://www.w3schools.com/media/media_mimeref.asp

0

Holen Sie sich eine Kopie von Fiddler so können Sie sehen, was die Antwort auf die Bild-URL ist.

Wenn möglich, ändern Sie den ASPX stattdessen in einen ASHX.

1

Ich kann Ihnen sagen, dass diese Art des Ladens von Bildern in IE7 funktioniert (hatte gerade den gleichen Sorta-Code vor einiger Zeit geschrieben). So könnte es folgende Probleme geben: 1) Versuchen Sie eine Response.Clear() vor dem Festlegen der ContentyType und eine Antwort.end am Ende. 2) Stellen Sie sicher, dass Ihre Nebenstelle in der Sitzung ohne den Zeitraum (.) Ist.es sollte nur gif für .gifs sein, jpg für .jpg usw.

S

0

in IE7 auf eine andere Website gehen versuchen.
Werden die Bilder für eine andere Website angezeigt?

Wenn es keine Bilder zeigt, vermute ich, dass Sie möglicherweise einige Einstellungen (z. B. Webentwickler Toolbar oder Fiddler) haben, um "Bilder nicht zu laden".

0

Ihr Code ist sehr kompliziert, warum nicht ein wenig vereinfachen, so dass Sie nur den Inhaltstyp festlegen?

Hier ist Code, den ich benutze, und es funktioniert in allen Browsern.

1

Sie sollten Ihre Seite mit Caching einrichten, einschließlich clientseitiger Cache-Steuerköpfe. Wenn Sie dies tun, stellen Sie sicher, dass Sie für jedes einzelne Bild einen anderen Dateinamen gesetzt

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

und den Cache-Client-Header

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

ich auch diese Seite in eine ASHX http-Handler machen würde zu bekommen Entfernen Sie den Overhead des Seitenlebenszyklus.

Ich habe diese ganze Sache ein paar Mal geschrieben und kann den Code bei Bedarf bereitstellen. Dieser Image-Endpunkt befindet sich auf einer Site, die etwa 80 Anfragen pro Sekunde erledigt.

0

Ich bin nicht 100 Prozent sicher über IE7, aber ich stieß auf ein ähnliches Problem mit ie8. Die Lösung für mein Problem bestand darin, sicherzustellen, dass ich den Inhaltstyp für "image/pjpeg" abgedeckt habe. Nicht sicher, wie viele verschiedene Coverages du brauchst, aber dieses hat mein Problem gelöst.