Обработчик изображений ASHX работает с Chrome, а не IE8 - PullRequest
2 голосов
/ 25 июля 2010

Я создал код для извлечения изображения из файловой системы с помощью обработчика ASHX. Код отображает изображение правильно в Chrome, но я получаю сломанное изображение в IE:

public class ImageHandler : IHttpHandler
{

    private int? QS_ImageID
    {
        get
        {
            int? temp = null;

            if (HttpContext.Current.Request.QueryString["ImageID"] != null)
                temp = HA.Utility.DataHelper.ParseDbInt(HttpContext.Current.Request.QueryString["ImageID"]);

            return temp;
        }

    }

    private bool QS_Thumbnail
    {
        get
        {
            bool thumbNail = false;
            if (HttpContext.Current.Request.QueryString["Thumbnail"] != null)
            {
                if (HttpContext.Current.Request.QueryString["Thumbnail"].Equals("1"))
                    thumbNail = true;
            }

            return thumbNail;
        }

    }

    public void ProcessRequest(HttpContext context)
    {
        if (QS_ImageID.HasValue)
        {
            int uploadID = QS_ImageID.Value;
            context.Response.ClearHeaders();
            context.Response.ClearContent();
            context.Response.Cache.SetNoStore();  
            context.Response.ContentType = UploadDAL.GetMetaData(uploadID).UploadContentType;
            context.Response.AddHeader("Content-Disposition", "inline;");

            if (QS_Thumbnail)
            {

                byte[] myImage = UploadDAL.GetFileThumbNail(uploadID);
                context.Response.AddHeader("Content-Length", myImage.GetLength(0).ToString());
                context.Response.BinaryWrite(myImage);
                context.Response.End();
            }
            else
            {
                byte[] myImage = UploadDAL.GetFile(uploadID);
                context.Response.AddHeader("Content-Length", myImage.GetLength(0).ToString());
                context.Response.BinaryWrite(myImage);
                context.Response.End();
            }
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}

Ответы [ 2 ]

3 голосов
/ 25 июля 2010

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

string getContentType(String path)
{
    switch (Path.GetExtension(path))
    {
        case ".bmp": return "Image/bmp";
        case ".gif": return "Image/gif";
        case ".jpg": return "Image/jpeg";
        case ".png": return "Image/png";
        default : break;
    }
    return "";
}

Если изображение физически хранится на жестком диске, вы можете использовать этот фрагмент кода как есть, если не по крайней мере, это может дать вам представление о том, как определить тип пантомимы. В методе ProcessRequest вы должны использовать

context.Response.ContentType = getContentType(imageFileName);

Конечно, как я уже говорил, если у вас нет физического пути к файлу (например, если он хранится в базе данных), вы все равно должны знать тип изображения.

Надеюсь, это поможет,
Андрей

1 голос
/ 18 августа 2010

IE требует MIME-тип.

Следующее я использую для получения MIME-типов изображений или заставляю его быть обычным файлом и позволяю системе обрабатывать его.

objMIMEType = Microsoft.Win32.Registry.GetValue("HKEY_CLASSES_ROOT\\." + objAttachment.Extension, "Content Type", "application/octetstream");

        if (objMIMEType != null)
            strMIMEType = objMIMEType.ToString();
        else
        {
            strMIMEType = "application/octetstream";
            context.Response.AddHeader("Content-Disposition", "attachment; filename=" + objAttachment.FullFileName);
            context.Response.AddHeader("Content-Length", objAttachment.AttachmentData.Length.ToString());
        }
...