1

我正在尝试通过 HttpHandler 将图像输出到输出流,但它不断抛出 ArgumentException。我已经用谷歌搜索了这个问题并尝试了很多东西,但我仍然无法解决这个问题。无论如何,这是代码:

    public void ProcessRequest(HttpContext context)
    {
        Int32 imageId = context.Request.QueryString["id"] != null ? 
            Convert.ToInt32(context.Request.QueryString["id"]) : default(Int32);

        if (imageId != 0)
        {
            //context.Response.ContentType = "image/jpeg";
            Byte[] imageData = this._imageInfoManager.GetTradeMarkImage(imageId);

            using (MemoryStream ms = new MemoryStream(imageData, 0, imageData.Length))
            {
                using (Image image = Image.FromStream(ms, true, true)) //this line throws
                {
                    image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
                }
            }
        }
        throw new ArgumentException("Image could not be found.");
    }

请注意,imageData 字节数组不为空,并且内存流正在正确填充。有什么想法吗?

更新: 这里的代码......请注意,图像以格式GetTradeMarkImage存储在 SQL Server 数据库中。image

    public Byte[] GetTradeMarkImage(Int32 id)
    {
        object result = DB.ExecuteScalar(SqlConstants.SqlProcedures.Request_GetImageById, id);

        if (result != null)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, result);
                return ms.ToArray();
            }                
        }
        return null;
    }
4

1 回答 1

1

好的,现在您已经发布了GetTradeMarkImage代码,这几乎肯定是问题所在:

using (MemoryStream ms = new MemoryStream())
{
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(ms, result);
    return ms.ToArray();
}

为什么您期望 的值BinaryFormatter是有效的图像流?目前尚不清楚您的数据库中有什么(BLOB?),也不清楚result这里的执行时间类型是什么(您应该通过调试找到),但您不应该在这里使用BinaryFormatter。我怀疑您只是想从数据库中获取原始数据,然后将其放入字节数组中。

如果你幸运的话,你也许可以从一开始result就投到。byte[](我不知道ExecuteScalarblob有什么作用,这显然不是“正常”的ExecuteScalar方法)。否则,您可能需要使用另一种方法,打开 aDataReader并以这种方式获取值。

于 2012-04-20T06:30:32.613 回答