بالنسبة لنافذة جديدة يتم فتحها أثناء التنزيل ويجب إغلاقها بعد التنزيل: فهي فعالة بالنسبة للملفات الصغيرة:
System.IO.FileInfo file = new System.IO.FileInfo("F:\mp3\mp3\لا تبكي على الشخص المفضل لدي.mp3");
استجابة. واضح ()؛
Response.ClearHeaders();
Response.Buffer = false;
Response.Charset="GB2312";
Response.ContentEncoding=System.Text.Encoding.UTF8;
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename="+Server.UrlEncode("لا تبكي على الشخص المفضل لدي.mp3"));
Response.AddHeader("Content-Length"، file.Length.ToString());
Response.WriteFile(file.FullName);
Response.Flush();
Response.End();
يمكن لهذا الرمز إخراج الملف وإغلاق النموذج المفتوح حديثًا.
بالنسبة للملفات الكبيرة، ليس من الأفضل استخدام الكود أعلاه، لأن الكود أعلاه يتم إخراجه بعد تخزين جميع الملفات مؤقتًا على الخادم. إذا كان الخادم الخاص بك به حركة مرور كثيفة وكان الملف كبيرًا، فلا يوصى باستخدام الطريقة المذكورة أعلاه .
لقد اختبرت ما يلي ويبدو أنه يعمل بشكل أفضل:
ملف الاستجابة المنطقي العام الثابت (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("قبول النطاقات"، "بايت")؛
_Response.Buffer = false;
long fileLength = myFile.Length;
بايتات بداية طويلة = 0;
حزمة كثافة العمليات = 10240؛ //10 كيلو بايت
int Sleep = (int)Math.Floor(1000 * pack / _speed) + 1;
إذا (_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());
إذا (startBytes! = 0)
{
_Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
}
_Response.AddHeader("Connection", "Keep-Alive");
_Response.ContentType = "application/octet-stream";
_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++)
{
إذا (_Response.IsClientConnected)
{
_Response.BinaryWrite(br.ReadBytes(pack));
Thread.Sleep(sleep);
}
آخر
{
i=maxCount;
}
}
_Response.Flush();
}
يمسك
{
عودة كاذبة.
}
أخيراً
{
br.Close();
myFile.Close();
}
}
يمسك
{
عودة كاذبة.
}
عودة صحيحة؛
}
هذا النوع من التعليمات البرمجية متاح أيضًا على الإنترنت، ويمكنه أيضًا إخراج الملفات وإغلاق نموذج النافذة المفتوحة حديثًا،
بالإضافة إلى ذلك، أثناء الاختبار، وجد أن بعض الأشياء غير المتوقعة ستحدث في أنظمة تشغيل الخادم والعميل بشكل عام، إذا لم يكن من الممكن إغلاق الكود أعلاه بشكل طبيعي، فيمكنك التحقق من إعدادات المتصفح في الخيارات المتقدمة.
علاوة على ذلك، يمكنك تعديل أنواع محتوى الإخراج المختلفة Response.ContentType = "application/octet-stream"؛ لأنه قد يتم تفسير أنواع المحتوى المختلفة بشكل مختلف من جانب العميل.
إذا كان لديك أي أفكار، يرجى الرد على المناقشات.
http://www.cnblogs.com/tour-code/archive/2006/10/25/539257.html