5

データベースのFILESTREAMに画像を保存していて、その画像をWebブラウザに戻すための最善の解決策を見つけようとしています。

ファイルシステム上のファイルを自分で管理している場合、最も簡単な方法は次のとおりです。

Response.TransmitFile(pathToFile);

これは、ファイルをクライアントに送り返す前にファイルをメモリにロードしないので(私の理解では)、それ自体が素晴らしくてスピーディーです。

現在、LinqtoSQLを使用してFILESTREAMを取得しています。これにより、FILESTREAMがバイナリオブジェクトとして提供されます。

これまでのところ、これは非常に醜い方法です。

Response.WriteBinary(fileStreamBinary.ToArray());

Linq to SQLに煩わされることなく、より直接的に物事を行うほうがよいでしょうか?

そもそもなぜFILESTREAMに悩まされ、自分でファイルを管理するだけではなかったのか疑問に思い始めています。「時流」という言葉を使わずに理由があったと思います!

4

3 に答える 3

1

そのことについて何 ?

byte[] buffer = new byte[bufferSize];
int nBytes;
while((nBytes = fileStreamBinary.Read(buffer, 0, bufferSize) != 0)
{
    Response.OutputStream.Write(buffer, 0, nBytes);
}

そうすれば、ストリーム全体をメモリにロードすることはありません

于 2009-06-06T01:19:26.363 に答える
1

これは、ファイルをクライアントに送信する前にメモリにロードしないため (私の理解では)、素晴らしく高速です。

正解ですが、忘れずResponse.BufferOutputに false に設定してください。デフォルト値は true です。

Linq to SQL に煩わされず、より直接的に物事を行うほうがよいのでしょうか?

最初にバイナリ コンテンツ全体をメモリにロードしたくない場合は、はい。データベースからバイナリ データをストリーミングする例を次に示します (再開可能なダウンロード機能を有効にする)。

そもそもなぜ FILESTREAM に悩まされ、自分でファイルを管理することに固執しなかったのか疑問に思い始めています。

主な利点は、トランザクション サポートとデータベース バックアップへの組み込みによるデータの整合性です。そのため、データベース バックアップとファイル システム バックアップの間の不一致について心配する必要はありません。マイナス面は常にパフォーマンスであり、このファイルストリーム機能全体が克服しようとしているものです. このドキュメントによると、平均で 1 MB 未満の場合、実際にはファイル システムよりもデータベースに保存する方が高速です。

Sql Server 2012 には、FileStream サポートに基づく FileTablesという新しい機能が追加されました。基本的に、そのディレクトリに追加されたファイルはデータベースの FileTable に自動的に追加されるという点で、ファイルシステム ディレクトリのデータベース ビューのように機能します (ファイルの Filestream バイナリ列を含む固定スキーマ テーブルで、他のテーブルからリンクできます)。 )。これにより、関数にフィードできるファイルへのパスを取得できますがResponse.TransmitFile(...)、SQL Filestream サポートの恩恵を受けることができます。

于 2012-02-02T02:49:09.747 に答える
0

基本的に Thomas が提示したものと同じアイデアですが、もう少し冗長です。バッファリングをオフにし、データを定期的にコミット/フラッシュして、クライアントに送信する前にすべての受信データをバッファリングしないようにする必要があります。

同様のコードを使用して、データベースの BLOB からデータ (この場合は Pdf:s) をストリーミングしています-> WCF サービス(ストリーミング) ->クライアント(ブラウザー)

これはおそらく、小さなアイテムには最適な方法ではありませんが、ある種のストリームからのものを送信する場合には便利です。

Response.Clear();
Response.ContentType = "application/pdf";
Response.Buffer = false;

var buffer = new byte[BufferSize];
int bytesRead;
while ((bytesRead = inputStream.Read(buffer, 0, BufferSize)) != 0)
{
     if (!Response.IsClientConnected)
          break;

     Response.OutputStream.Write(buffer, 0, bytesRead);
     Response.Flush();
}
于 2011-04-14T12:15:11.150 に答える