System.IO.Stream iStream = null;
// 10K バイトをチャンクで読み取るバッファ:
byte[] バッファ = 新しい Byte[10240];
// ファイルの長さ:
整数の長さ;
// 読み取る合計バイト数:
読み込む長いデータ;
// ダウンロードするファイルをそのパスも含めて特定します。
文字列ファイルパス = @"E:softwareSQL Server 2000 Personal Edition.ISO";
// ファイル名を特定します。
文字列ファイル名 = System.IO.Path.GetFileName(ファイルパス);
試す
{
// ファイルを開きます。
iStream = 新しい System.IO.FileStream(ファイルパス, System.IO.FileMode.Open,
System.IO.FileAccess.Read、System.IO.FileShare.Read);
Response.Clear();
// 読み取る合計バイト数:
dataToRead = iStream.Length;
長い p = 0;
if(Request.Headers["範囲"]!=null)
{
応答.ステータスコード = 206;
p = long.Parse(Request.Headers["Range"].Replace("bytes=","").Replace("-",""));
}
if(p != 0)
{
Response.AddHeader("Content-Range","bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());
}
Response.AddHeader("Content-Length",((long)(dataToRead-p)).ToString());
Response.ContentType = "アプリケーション/オクテットストリーム";
Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(filename)));
iStream.Position = p;
データToRead = データToRead - p;
// バイトを読み取ります。
while (dataToRead > 0)
{
// クライアントが接続されていることを確認します。
if (Response.IsClientConnected)
{
// バッファ内のデータを読み取ります。
長さ = iStream.Read(バッファ, 0, 10240);
// データを現在の出力ストリームに書き込みます。
Response.OutputStream.Write(バッファ, 0, 長さ);
// データを HTML 出力にフラッシュします。
Response.Flush();
バッファ = 新しいバイト [10240];
dataToRead = dataToRead - 長さ;
}
それ以外
{
//ユーザーが切断した場合の無限ループを防ぐ
データを読み取る = -1;
}
}
}
catch (例外例)
{
// エラーがあればそれをトラップします。
Response.Write("エラー: " + ex.Message);
}
ついに
{
if (iStream != null)
{
//ファイルを閉じます。
iStream.Close();
}
Response.End();
}