2

データベースに画像を保存しており、画像ハンドラーを使用して、ファイル パス + ID を使用して画像を表示しています。私が抱えている問題は、ページから画像を更新しても画像が変わらないことです。奇妙なことに、Firefox や Chrome ではこの問題は発生しません。

ASHX ハンドラー

public void ProcessRequest(HttpContext context)
    {
        Guid image_id;
        if (context.Request.QueryString["id"] != null)
            image_id = System.Guid.Parse(context.Request.QueryString["id"]);
        else
            throw new ArgumentException("No parameter specified");

        context.Response.ContentType = "image/jpeg";
        Stream strm = GetImageFromDatabase(image_id);
        if (strm != null)
        {
            byte[] buffer = new byte[4096];
            int byteSeq = strm.Read(buffer, 0, 4096);

            while (byteSeq > 0)
            {
                context.Response.OutputStream.Write(buffer, 0, byteSeq);
                byteSeq = strm.Read(buffer, 0, 4096);
            }
            //context.Response.BinaryWrite(buffer);
        }
    }

ユーザー制御コード

string imagePath = "<a href=" + (Image.ImageUrl = "~/ShowImage.ashx?id=" + r["Image_id"]);

マークアップ

<asp:UpdatePanel ID="Upd1" runat="server" UpdateMode="Always" >
    <ContentTemplate>
        <div id="mpe" style="width: 600px; padding: 5px;">
            <uc2:IMG ID="IMG1" cssclass="bodycopy" runat="server" />
        </div>
        <asp:UpdateProgress ID="upp1" runat="server" AssociatedUpdatePanelID="Upd1">
            <ProgressTemplate>
                <div id="progressBackgroundFilter">
                </div>
                <div id="modalPopup">
                    &nbsp; &nbsp; Loading...
                    <img align="middle" src="../images/Ajax/loading_1.gif" />
                </div>
            </ProgressTemplate>
        </asp:UpdateProgress>
    </ContentTemplate>
</asp:UpdatePanel>

投稿する他のコードはわかりませんが、関連性があると思われるものは次のとおりです。ボタンをクリックして画像を更新すると、データベース内の行が正常に更新されます。また、画像に関するデータを更新することもでき、これは正しく更新されます。

何か案は?

4

4 に答える 4

1

IEはデータをキャッシュし、URLが変更されない場合は同じものを表示します。私も同じ問題に直面していて、次のトリックでそれを取り除きました:-

imgUser.ImageUrl = "Handler.ashx?UserID=" + Convert.ToString(Session["userid"]) + "extraQS=" + DateTime.Now.Second;

DateTime.Now.Secondを使用したextraQSクエリ文字列は、URLを動的にすることでトリックを作成します。したがって、URLはリクエストごとに変更され、画像はブラウザのキャッシュから使用されません。

注:-Handler.ashxの余分なクエリ文字列引数は無視してください。

于 2012-06-20T12:17:32.173 に答える
0

私がやったのは、イメージハンドラーでイメージ ID として GUID を使用することです。しかし、私のSQLでは、画像を更新するときに、SQLサーバーに組み込まれたnewid()関数を使用するため、更新が行われるたびに画像のGUIDが変更されます。これにより、IE は同じ ID ではないことを認識し、キャッシュされた画像を使用しません。

于 2012-04-27T13:47:41.393 に答える
0

このコードを使ってみませんか?

string imagePath = "<a href='" + Page.ResolveClientUrl("~/ShowImage.ashx?id=" + r["Image_id"]) + "' />";
于 2012-04-17T14:24:29.483 に答える