สำหรับหน้าต่างใหม่ที่เปิดขึ้นระหว่างการดาวน์โหลดและจำเป็นต้องปิดหลังการดาวน์โหลด: จะมีผลกับไฟล์ขนาดเล็ก:
ไฟล์ System.IO.FileInfo = new System.IO.FileInfo("F:\mp3\mp3\Don't cry my favorite person.mp3");
การตอบสนอง.Clear();
Response.ClearHeaders();
Response.Buffer = เท็จ;
Response.Charset="GB2312";
Response.ContentEncoding=System.Text.Encoding.UTF8;
Response.ContentType = "application/octet-stream";
Response.AddHeader("การจัดการเนื้อหา", "ไฟล์แนบ; filename="+Server.UrlEncode("อย่าร้องไห้คนโปรดของฉัน.mp3"));
Response.AddHeader("ความยาวเนื้อหา", file.Length.ToString());
Response.WriteFile (ไฟล์. ชื่อเต็ม);
การตอบสนองฟลัช();
การตอบสนองสิ้นสุด();
รหัสนี้สามารถส่งออกไฟล์และปิดแบบฟอร์มที่เพิ่งเปิดใหม่
สำหรับไฟล์ขนาดใหญ่ ไม่ควรใช้โค้ดด้านบน เนื่องจากโค้ดด้านบนจะถูกส่งออกหลังจากไฟล์ทั้งหมดถูกแคชไว้บนเซิร์ฟเวอร์ หากเซิร์ฟเวอร์ของคุณมีการรับส่งข้อมูลจำนวนมากและไฟล์มีขนาดใหญ่ ไม่แนะนำให้ใช้วิธีการข้างต้น .
ฉันได้ทดสอบสิ่งต่อไปนี้แล้วและดูเหมือนว่าจะทำงานได้ดีขึ้น:
บูลคงที่สาธารณะ ResponseFile (HttpRequest _Request, HttpResponse _Response, string _fileName, string _fullPath, long _speed)
-
พยายาม
-
FileStream myFile = FileStream ใหม่ (_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader br = BinaryReader ใหม่ (myFile);
พยายาม
-
_Response.AddHeader("ยอมรับช่วง", "ไบต์");
_Response.Buffer = เท็จ;
ยาว fileLength = myFile.Length;
ไบต์เริ่มต้นยาว = 0;
int pack = 10240; //10K ไบต์
int sleep = (int) Math.Floor (1,000 * แพ็ค / _speed) + 1;
ถ้า (_Request.Headers["Range"] != null)
-
_Response.รหัสสถานะ = 206;
string[] range = _Request.Headers["Range"].Split(อักขระใหม่[] {'=', '-'});
startBytes = Convert.ToInt64 (ช่วง [1]);
-
_Response.AddHeader("ความยาวเนื้อหา", (ความยาวไฟล์ - startBytes).ToString());
ถ้า (startBytes != 0)
-
_Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
-
_Response.AddHeader("การเชื่อมต่อ", "Keep-Alive");
_Response.ContentType = "application/octet-stream";
_Response.AddHeader("การจัดการเนื้อหา", "ไฟล์แนบ; 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++)
-
ถ้า (_Response.IsClientConnected)
-
_Response.BinaryWrite (br.ReadBytes (แพ็ค));
Thread.Sleep(นอน);
-
อื่น
-
i=จำนวนสูงสุด;
-
-
_Response.ฟลัช();
-
จับ
-
กลับเท็จ;
-
ในที่สุด
-
br.ปิด();
myFile.Close();
-
-
จับ
-
กลับเท็จ;
-
กลับเป็นจริง;
-
โค้ดประเภทนี้มีอยู่ในอินเทอร์เน็ตด้วย นอกจากนี้ยังสามารถส่งออกไฟล์และปิดแบบฟอร์มหน้าต่างที่เพิ่งเปิดใหม่ได้
นอกจากนี้ ในระหว่างการทดสอบยังพบว่ามีสิ่งไม่คาดคิดเกิดขึ้นหากระบบปฏิบัติการของเซิร์ฟเวอร์และไคลเอนต์ โดยทั่วไปแล้ว หากไม่สามารถปิดโค้ดข้างต้นได้ตามปกติ คุณสามารถตรวจสอบการตั้งค่าเบราว์เซอร์ได้ในขั้นสูง
นอกจากนี้ คุณสามารถแก้ไขประเภทเนื้อหาเอาต์พุตที่แตกต่างกัน Response.ContentType = "application/octet-stream"; เนื่องจากประเภทเนื้อหาที่แตกต่างกันอาจถูกตีความแตกต่างกันในฝั่งไคลเอ็นต์
หากคุณมีความคิดใด ๆ โปรดตอบกลับ
http://www.cnblogs.com/tour-code/archive/2006/10/25/539257.html