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です...画像はSQLServerデータベースに次の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ください。データベースから生データを取り出して、それをバイト配列に入れたいだけだと思います。

運が良ければ、最初からキャストできるかもしれません。(blobで何が行われるかはわかりませんが、これは明らかに「通常の」方法ではありません)。それ以外の場合は、別のアプローチを使用して、を開き、その方法で値を取得する必要があります。resultbyte[]ExecuteScalarExecuteScalarDataReader

于 2012-04-20T06:30:32.613 に答える