4

写真をレコードの詳細として表示できるシステムがあります。従業員の猫の写真だとしましょう。
これらの写真はデータベースに保存されています。

現在、誰かが子猫を見たいとき。imgこのようにタグをレンダリングします。

<a href="#" onclick="RenderTag('20');return false;">View Kitty</a>
<div id="imageDiv"></div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
function RenderTag(id){
    $('#imageDiv').html('<img src="http://localhost/GetKitty.aspx?ID=' + id + '" />');
}
</script>

そして、GetKitty.aspxはそのように機能します

protected void Page_Load(object sender, EventArgs e)
{
    Response.Clear();
    Response.AddHeader("Content-Disposition","attachment;FileName=kitty.bmp");
    Response.ContentType = "image/bmp";
    Response.Cache.SetLastModified(DateTime.Now);
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Bitmap kitty = GetKittyBitmap(Request.QueryString("ID"));
    kitty.Save(Response.OutputStream, kitty.RawFormat);
    Response.Flush();
    Response.Close();
    kitty.Dispose();
}

アンカーリンクをクリックすると、ページはそのようになります。
ここに画像の説明を入力してください

問題は、キティがモバイルデバイスに表示されないことがあり、ユーザーがイライラしてオフィスにいる誰かに電話をかけて、携帯電話でキティの写真を撮り、キティの写真をメールで送信することです。

子猫の写真をメールで送信する需要が非常に高いため、子猫の写真を送信するメール機能をシステムに組み込むことが求められています。

子猫のくそったれの写真がいつも期待どおりにレンダリングされるのであれば、その機能を構築することは避けられます。

データベースに保存されている画像を表示するためのより信頼性の高い方法はありますか?

4

3 に答える 3

0

このSOの投稿に示されているように、jQuery .load関数を使用して、エラー処理機能を提供する(そしておそらくイメージの取得を再開する)ことを試みることができます。

于 2012-08-17T17:22:20.890 に答える
0

このアプローチには問題はありませんが、これをHttpHandler(.ashx)として実装する必要があります。

キティは、ページのライフサイクル全体とそれに続くaspxページを実行する必要がなければ、サーバーからより速く抜け出すことができます。

この画像はWeb経由で送信するため、jpgやpngなどの圧縮形式の使用を検討してください。ビットマップは大きいです。キティを早く送り出すほうがいい。

アプリケーションの負荷テストを行い、複数のクライアントから数回ダウンロードしてファイルを保存します。IISは、処理できる同時要求の数で制限に達することがあります。

1ページにそのような子猫の画像がいくつかあるページがある場合は、asp.netへのリクエストが非常に多くなります。asp.net 2.0では、デフォルトのスレッド数はわずか25です。

于 2012-08-17T18:37:15.220 に答える
0

OK、私は子猫を常にレンダリングさせる信頼できる方法を発見しました!

Content-Lengthヘッダーを追加すると問題が解決するようです。

私はそのようにそれを実装します。

using (MemoryStream inputMS = NewMemoryStream(kittyBytes))
using (Bitmap kittyBitmap = new Bitmap(inputMS))
{
    Response.Clear();
    Response.Cache.SetLastModified(DateTime.Now);
    Response.Cache.SetCacheability(HttpCacheability.NoCache);

    //Some logic goes here determining the image type of the kitty
    //We send low rez jpgs at certain times
    string kittyFileSuffix = ".bmp";
    string kittyContentType = "image/bmp";

    Response.AddHeader("Content-Disposition", "attachment;FileName=Kitty" + kittyFileType);
    Response.ContentType = kittyContentType;
    using (Image smallKitty = ResizeKitty(kittyBitmap))
    {
        long quality = 40;
        Imaging.EncoderParameters ep = new Imaging.EncoderParameters(1);
        ep.Param[0] = new Imaging.EncoderParameter(Imaging.Encoder.Quality, quality);
        using (MemoryStream outputMS = new MemoryStream())
        {
            smallKitty.Save(outputMS, GetImageCodecInfo(kittyContentType), ep);
            Response.AddHeader("Content-Length", outputMS.Length);
            outputMS.WriteTo(Response.OutputStream);
            Response.Flush();
            Response.Close():
        }
    }
}
于 2012-09-05T15:10:43.473 に答える