// ハードディスク ファイルの出力、大きなファイルのダウンロード サポートの提供、ダウンロードの再開、速度制限、リソース使用量の削減
//入力パラメータ _Request: Page.Request オブジェクト、_Response: Page.Response オブジェクト、_fileName: ダウンロード ファイル名、_fullPath: ファイル名を含むダウンロード パス、_speed 1 秒あたりのダウンロードが許可されるバイト数
// 成功したかどうかを返す
public static bool ResponseFile(HttpRequest _Request、HttpResponse _Response、string _fileName、string _fullPath、long _speed)
{
試す
{
FileStream myFile = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader br = 新しい BinaryReader(myFile);
試す
{
_Response.AddHeader("Accept-Range", "bytes");
_Response.Buffer = false;
長いファイルの長さ = myFile.Length;
長いスタートバイト = 0;
int パック = 10240 //10K バイト;
//int sleep = 200 //1 秒あたり 5 回、つまり 1 秒あたり 5*10K バイト
int sleep = (int)Math.Floor(1000 * パック / _speed) + 1;
if (_Request.Headers["Range"] != null)
{
_Response.StatusCode = 206;
string[] range = _Request.Headers["Range"].Split(new char[] {'=', '-'});
startBytes = Convert.ToInt64(range[1]);
}
_Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
if (startBytes != 0)
{
_Response.AddHeader("Content-Range", string.Format(" バイト {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
}
_Response.AddHeader("接続", "キープアライブ");
_Response.ContentType = "アプリケーション/オクテットストリーム";
_Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(_fileName,System.Text.Encoding.UTF8) );
br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
int maxCount = (int) Math.Floor((fileLength - startBytes) / Pack) + 1;
for (int i = 0; i < maxCount; i++)
{
if (_Response.IsClientConnected)
{
_Response.BinaryWrite(br.ReadBytes(pack));
Thread.Sleep(スリープ);
}
それ以外
{
i=最大数;
}
}
}
キャッチ
{
false を返します。
}
ついに
{
br.Close();
myFile.Close();
}
}
キャッチ
{
false を返します。
}
true を返します。
}
呼び出し例
Page.Response.Clear();
bool success = ResponseFile(Page.Request, Page.Response, "ファイル名", @"C:download.date", 1024000);
if(!成功)
Response.Write("ファイルのダウンロード中にエラーが発生しました!")
;