2011-12-16 15 views
6

データベースからバイナリストリームとしてフェッチされたイメージをWebフォームに表示しようとしています。あなたはこれについていくつかの光を当てることができます!<img>タグとしてhtml内に "image"としてデータベースから取得したバイナリストリームを表示

私は、ユーザーがプロフィールを持ち、すべてのユーザーが自分のプロフィール画像をホームページに表示しているプロジェクトに取り組んでいます。この写真はデータベースからのものです。

ここで私はストリームを取得するために使用したコードです!

TestDBDataContext context1 = new TestDBDataContext(); 

      var r = (from a in context1.ImageTables where a.Id == 8 select a).First(); 

      MemoryStream stream = new MemoryStream(r.FileImage.ToArray()); 

おかげ

答えて

4

そうのように、aspxページに画像のURLを設定している私が過去にやった:その後

<img src="getLogo.aspx" alt="Logo" /> 

、getLogo.aspxのコードビハインドで、私は次のことを行ってきました:バイト配列

+0

wudは毎回ポストバックを作成します。 –

+1

いいえ、POST経由でデータが返送されることはありません。 –

+0

ありがとう、これは私が探していたものです! –

3

私は(そのようなレコードの主キーとしてナンセンス名を使用して外部の発信者がアクセス可能なウェブサイト内のディレクトリ(つまり、画像サブディレクトリ)に画像を保存しますデータベースまたはGUID)、Webページのこのファイルにhrefを追加します。

+0

ありがとう、しかし、もし私がそれをしなければならなかったのはなぜwud私はデータベースに全く保存されますか?私はそのことをやっていることを知っていますが、何か良いアイデアを探していますか? –

+1

@ShaneAdrianMuaz:私は考えることができるいくつかの理由:1)最終的に複数のWebサーバーを持つ可能性があるので、それぞれのファイルを調整する必要はありません。 2)新しいWebサーバーまたはプラットフォームに移行することができます。そのため、ファイルを管理する必要がなくなり、価値があります。 3)画像がビジネスに関連するものである場合は、シルバーライトやタブレットアプリなどの別のクライアントで画像を表現する必要があります。 –

+1

はい、しかし、それらの理由(彼らはすでにDBに保存することを選択しています)を与えられた理由は、Webrootのファイルとしてなぜそれを持っていますか?それはちょっと変だ。 –

7

Base64では、(合わせてMIMEタイプを変更する)あなたのバイナリをエンコードし、次のようにイメージタグに挿入します。

<img src="data:image/gif;base64,BASE64 ENCODED BINARY HERE"> 

これは、あなたがそれを行うだろうかですが、いくつかのブラウザが処理できないように私はこれをしないだろうそれ(IE6)。最初にファイルに保存し、従来の方法でファイルを保存する方がよいです。

+0

画像を保存してリンクする以外にも、これを行う方法はありますか?例えば、httphandlerやsomethnを使っているかもしれませんか? –

+1

私はDJ Quimbyが正しいアプローチをしていると思います。PHPでは、イメージ名をクエリパラメータとして使用するスクリプトを作成し、データストアからバイナリを取り出してブラウザに返し、コンテンツタイプのヘッダーを正しいmimetype。 –

1

保存メモリストリームが使用してファイルに:

MemoryStream memoryStream = new MemoryStream(); 
    using (FileStream fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.Write)) 
    { 
     memoryStream.SaveTo(fileStream); 
    } 

はその後、HTMLでのファイル名を入れました。

+0

申し訳ありませんが、私はここであなたのポイントを得ていませんでした。 –

1

まず、実際に私はこのためIHTTPハンドラの過負荷を好むと思います(画像用に別の.aspxファイルを持っていますが、原理はサムのようimageDataがあなたのイメージである

Response.BinaryWrite(imageData); 
Response.ContentType = "image/gif"; 

eと一度に1つの新しい概念を導入しましょう)。

.aspxファイルはコードビハインドから継承され、内容はありません。だから、それは<%@ Page %>の指示文を持っていて、それ以外のものはありません。

コードビハインドでは、ページロードイベントハンドラでイメージを取得し、応答のコンテンツタイプを適切な値に設定します(たとえば、すべてのイメージがimage/pngの場合、ちょうどハードコード)。次に、イメージを出力に書き込みます。

TestDBDataContext context1 = new TestDBDataContext(); 
int id; 
if(int.TryParse(Request.QueryString["id"], out id)) 
{ 
    var r = (from a in context1.ImageTables where a.Id == 8 select a).FirstOrDefault(); 
    if(r != null) 
    { 
    Response.ContentType = r.ContentType; 
    Response.BinaryWrite(r.FileImage.ToArray()); 
    return; 
    } 
} 
//code to handle 404 not found for no such image here (send error message or Server.Transfer to error page, etc. 

その後、等<img src="profileImg.aspx?id=8" alt="" />でこれを使用することができ

性能向上がデータベースから一度にバイトに4kのチャンクを取得しなくメモリ内の1つの巨大なアレイよりも、Response.OutputStreamに書き込むことです。小さなファイルの場合、その違いは重要ではありませんが、非常に大きなファイルの場合、かなりの量になる可能性があります(「今すぐWebサーバーが繰り返し使用されていません」など)。

+0

もし私がhttphandlerでこれをやろうとすれば、違いは何ですか? –

+1

レスポンスで単純なタスクを1つだけ実行している場合は、やや軽くてクリーナーです。実際には、aspxページは、とにかくIHttpHandlerの実装であり、他にも便利な機能があります。一度あなたがあなたの現在の問題を解決する方法を知っていればうれしいです、私はそれをHttpHandlerの方法で試してみることをお勧めします。初めての場合は余分な合併症のように思えるかもしれませんが、一度それらに慣れれば、このような場合にはもっと簡単に思えるようになります。 –

+0

ありがとう、これは本当にヘルプ –

関連する問題