ファイルを SQL Server データベースに正常にアップロードしました。情報を GridView に戻すことができます。実際にファイルを開くためのハイパーリンクを作成する方法がわかりません。
4 に答える
写真を処理し、DB コンテンツを応答ストリームに返す URL を作成する必要があります。SQL Saturday #26で、私はまさにこれを示すプレゼンテーションを行いました。リンクから私のスライドを実行し、Demo 2 に移動すると、lotsOfPictures ソリューションで Picture.aspx.cs を見つけることができます。
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
SqlCommand cmd = new SqlCommand(
@"SELECT picture
FROM resized_pictures
WHERE picture_id = @id
AND picture_size = @size;", conn);
cmd.Parameters.AddWithValue("@id", pictureId);
cmd.Parameters.AddWithValue("@size", size);
using (SqlDataReader rdr = cmd.ExecuteReader(
CommandBehavior.SequentialAccess))
{
if (rdr.Read())
{
Response.ContentType = "image/jpeg";
byte[] bytes = new byte[1024];
long offSet = 0;
int countRead = (int) rdr.GetBytes(
0, offSet, bytes, 0, 1024);
while (countRead > 0)
{
Response.OutputStream.Write(bytes, 0, countRead);
offSet += countRead;
countRead = (int)rdr.GetBytes(
0, offSet, bytes, 0, 1024);
}
}
}
}
パズルの重要なピースは、真のストリームを返す SqlCommand リーダーに渡される SequentialAccess フラグです。そのため、ページは戻る前にイメージ全体をメモリにロードしません。高性能サーバーの場合、ASP.NET 2.0 の非同期ページで説明されているように、非同期操作を使用する必要があります。
通常、サーバー側のコードを使用して適切なヘッダーを送信し、コンテンツをエコーするだけです。
PHPマニュアルから:
// We'll be outputting a PDF
header('Content-type: application/pdf');
// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');
// The PDF source is in original.pdf
readfile('original.pdf');
ファイルがデータベースに保存されている場合は、おそらくブログまたはバイト配列として保存されています。ハイパーリンクのクリック イベントでは、バイト配列をストリームに渡し、ストリーム ライターを使用してファイルを作成する必要があります。次に、ファイルを実行します。
自分でこれを試したことはありませんが、データをローカル ファイル システムの一時ファイルにストリーミングしてから、その一時ファイルへのリンクを提供するのはどうでしょうか。