ダウンロード中に新しいウィンドウが開き、ダウンロード後に閉じる必要がある場合: ファイルが小さい場合に効果的です。
System.IO.FileInfo file = new System.IO.FileInfo("F:\mp3\mp3\私の好きな人を泣かないでください.mp3");
Response.Clear();
Response.ClearHeaders();
Response.Buffer = false;
Response.Charset="GB2312";
Response.ContentEncoding=System.Text.Encoding.UTF8;
Response.ContentType = "アプリケーション/オクテットストリーム";
Response.AddHeader("Content-Disposition", "attachment; filename="+Server.UrlEncode("泣かないで私の好きな人.mp3"));
Response.AddHeader("Content-Length", file.Length.ToString());
Response.WriteFile(file.FullName);
Response.Flush();
Response.End();
このコードは、ファイルを出力し、新しく開いたフォームを閉じることができます。
サーバーのトラフィックが多く、ファイルが大きい場合、上記のコードはすべてのファイルがサーバーにキャッシュされた後に出力されるため、大きなファイルの場合は上記のコードを使用することはお勧めできません。 。
以下をテストしましたが、より良く機能するようです。
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 = (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=最大数;
}
}
_Response.Flush();
}
キャッチ
{
false を返します。
}
ついに
{
br.Close();
myFile.Close();
}
}
キャッチ
{
false を返します。
}
true を返します。
}
この種のコードはインターネット上でも入手でき、ファイルを出力したり、新しく開いたウィンドウ フォームを閉じたりすることもできます。
また、テスト中に、サーバーとクライアントのオペレーティング システムが異なると予期せぬことが起こることが判明しました
。一般的には、上記のコードを正常に終了できない場合は、「詳細設定」でブラウザの設定を確認してください。
さらに、コンテンツタイプが異なればクライアント側で解釈が異なる可能性があるため、さまざまな出力コンテンツタイプを変更できます。
何かアイデアがあれば、ぜひご返信ください。
http://www.cnblogs.com/tour-code/archive/2006/10/25/539257.html