다운로드 중에 열리고 다운로드 후 닫아야 하는 새 창의 경우: 작은 파일에 효과적입니다.
System.IO.FileInfo file = new System.IO.FileInfo("F:\mp3\mp3\내가 가장 좋아하는 사람을 울지 마세요.mp3");
응답.지우기();
응답.ClearHeaders();
응답.버퍼 = 거짓;
Response.Charset="GB2312";
Response.ContentEncoding=System.Text.Encoding.UTF8;
Response.ContentType = "응용 프로그램/옥텟 스트림";
Response.AddHeader("Content-Disposition", "attachment; filename="+Server.UrlEncode("내가 가장 좋아하는 사람은 울지 마세요.mp3"));
Response.AddHeader("콘텐츠 길이", file.Length.ToString());
Response.WriteFile(파일.풀이름);
응답.플러시();
응답.끝();
이 코드는 파일을 출력하고 새로 열린 양식을 닫을 수 있습니다.
대용량 파일의 경우 위의 코드를 사용하는 것은 좋지 않습니다. 서버에 모든 파일을 캐시한 후에 위의 코드가 출력되기 때문입니다. 서버의 트래픽이 많고 파일이 큰 경우 위의 방법을 사용하지 않는 것이 좋습니다. .
다음을 테스트했는데 더 잘 작동하는 것 같습니다.
공개 정적 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 = new BinaryReader(myFile);
노력하다
{
_Response.AddHeader("Accept-Ranges", "bytes");
_Response.Buffer = 거짓;
긴 fileLength = myFile.Length;
긴 startBytes = 0;
int pack = 10240; //10K 바이트
int sleep = (int)Math.Floor(1000 * pack / _speed) + 1;
if (_Request.Headers["Range"] != null)
{
_Response.StatusCode = 206;
string[] range = _Request.Headers["Range"].Split(new char[] {'=', '-'});
startBytes = Convert.ToInt64(범위[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();
}
잡다
{
거짓을 반환;
}
마지막으로
{
br.닫기();
myFile.Close();
}
}
잡다
{
거짓을 반환;
}
사실을 반환;
}
이러한 종류의 코드는 인터넷에서도 사용할 수 있으며, 파일을 출력하고 새로 열린 창 형식을 닫을 수도 있습니다.
또한 테스트 중에 서버와 클라이언트의 운영 체제에 따라 예상치 못한 일이 발생하는 것으로 나타났습니다
.일반적으로 위 코드를 정상적으로 종료할 수 없는 경우에는 고급에서 브라우저 설정을 확인하시면 됩니다.
또한 다양한 콘텐츠 유형이 클라이언트 측에서 다르게 해석될 수 있으므로 다양한 출력 콘텐츠 유형을 수정할 수 있습니다.
아이디어가 있으시면 토론을 환영합니다.
http://www.cnblogs.com/tour-code/archive/2006/10/25/539257.html