.aspx页面在IE7上的Response.BinaryWrite图像

时间:2009-03-10 15:04:43

标签: c# .net image internet-explorer-7

我维护一个具有.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);
    }

编辑:

好的,我按照你的建议进行了一些研究,我把方法改为以下方法,但它仍然不起作用。

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 个答案:

答案 0 :(得分:2)

你的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

答案 1 :(得分:1)

我可以告诉你,这种图像加载方式在IE7中工作得很好(一段时间之前只写了相同的排序代码)。因此,可能存在以下问题: 1)在设置ContentyType之前尝试执行Response.Clear()并最后执行response.end。 2)确保你在会话中的扩展名没有句点(。),即它应该只是gif for .gifs,jpg for .jpg等。

取值

答案 2 :(得分: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);

我会将此页面变成ASHX http处理程序,以消除页面生命周期的开销。

我已将这整件事写了几遍,如果需要可以提供代码。此映像端点位于每秒执行大约80个请求的站点上。

答案 3 :(得分:0)

你可以试试......

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

......就在......之前......

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

我们必须这样做才能在IE7中获得正确的文件类型关联。

答案 4 :(得分:0)

尝试将内容处置设置为内联而非附件,例如:

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

虽然大多数浏览器在这方面非常灵活,但“附件”旨在要求用户采取进一步行动。 IETF RFC 1806

  

附件的显示是   通常被解释为要求   积极行动的部分   收件人,内联邮件   组件自动显示   查看邮件时。

答案 5 :(得分:0)

获取Fiddler的副本,以便了解对图片网址的响应。

如果可能,请将ASPX更改为ASHX。

答案 6 :(得分:0)

尝试访问IE7中的其他网站 它是否显示任何其他网站的图像?

如果它没有显示图像,我猜你可能有一些设置(例如网页开发者工具栏或提琴手)“不加载图片”。

答案 7 :(得分:0)

您的代码非常复杂,为什么不简化它,以便您只设置内容类型?

这是我使用的代码,它适用于所有浏览器。

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

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

答案 8 :(得分:0)

图像因IE7无法显示而损坏,但Firefox可以。图像很大,不适合屏幕,我没看到它被切断的地方。

感谢你的所有建议。

答案 9 :(得分:0)

我对IE7并不是百分之百确定,但是我遇到了与ie8类似的问题。我的问题的解决方案是确保我覆盖了“image / pjpeg”的内容类型。不确定你需要多少不同的覆盖范围,但这个覆盖了我的问题。