1

asp.NET Web Forms (4.0) アプリケーションから Oracle 11g データベースに画像をアップロードしたいと考えています。最終的には、画像も取得する必要があります。

ブロブ型を使用するように言われましたが、より良い解決策が見つかれば変更される可能性があります。

フロント エンドの観点から、私は asp.NET ファイル アップロード コンポーネントを使用しており、ファイルのパスを選択するのに最適です。

それを回避する最善の方法は何ですか?ブロブを操作しますか? bfile で動作しますか? サーバーに画像をアップロードし、パスを保存するだけですか?

4

2 に答える 2

4

BLOB 列を含む IMAGES というテーブルがあると仮定すると、次のようなことを行う必要があります。

byte[] imageData = FileUpload1.FileBytes;

OracleCommand cmd = new OracleCommand("INSERT INTO IMAGES(PARENT_ID, IMAGE_DATA) VALUES(:1, :2)", connection);
cmd.Parameters.Add("1", OracleDbType.Int32, parentID, ParameterDirection.Input);
cmd.Parameters.Add("2", OracleDbType.Blob, imageData, ParameterDirection.Input);

cmd.ExecuteNonQuery();

更新<img src="ImageFromDatabase.ashx?id=1234">: 画像を表示する場合、主に、HTML ページには画像への参照のみが含まれていること ( ) と、画像自体が別の要求によって提供されることを理解する必要があります。次の例では、Generic Handlerを使用しています。

public void ProcessRequest (HttpContext context) {
    HttpRequest request = context.Request;
    int parentID = Int32.Parse(request.QueryString["id"]);

    OracleCommand cmd = new OracleCommand("SELECT * FROM IMAGES WHERE PARENT_ID = :1", connection);
    cmd.Parameters.Add("1", OracleDbType.Int32, parentID, ParameterDirection.Input);
    OracleDataReader reader = cmd.ExecuteReader();

    byte[] imageData = ((OracleBlob)reader["IMAGE_DATA"]).Value;
    context.Response.ContentType = "image/jpeg";
    context.Response.BinaryWrite(imageByte);
} 

実際のアプリケーションで追加する必要があるエラー処理はすべて省略しました。

更新 2:

グリッド ビューを使用している場合は、次のように画像列を定義できます。

<asp:Image ID="Image1" runat="server" ImageUrl='<%# "ImageFromDatabase.ashx?id=" + Eval("ImageID")%>'/>
于 2012-07-16T08:58:17.910 に答える
2

サーバーに画像をアップロードしてパスを保存するのが最善です。

なぜ聞くの?

  1. 現代のOSはファイルシステムが高速であるため、画像のフェッチはDBから提供するよりもはるかに高速です。
  2. 画像をデータベースに保存すると、データベースに過度のストレスがかかります。
  3. 画像はファイルシステム上にあるため、画像を提供するサービスの代わりにパスを使用するだけで済みます。
于 2012-07-16T08:17:27.103 に答える