// إخراج ملفات القرص الصلب، وتوفير دعم التنزيل للملفات الكبيرة، واستئناف التنزيل، والحد الأقصى للسرعة، واستخدام الموارد الصغيرة
// معلمات الإدخال _Request: كائن Page.Request، _Response: كائن Page.Response، _fileName: اسم ملف التنزيل، _fullPath: مسار التنزيل باسم الملف، _speed عدد البايتات المسموح بتنزيلها في الثانية
// إرجاع ما إذا كان ناجحًا
ملف الاستجابة المنطقي العام الثابت (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 = 200; // 5 مرات في الثانية، أي 5*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;
}
}
}
يمسك
{
عودة كاذبة.
}
أخيراً
{
br.Close();
myFile.Close();
}
}
يمسك
{
عودة كاذبة.
}
عودة صحيحة؛
}
استدعاء المثال
Page.Response.Clear();
نجاح منطقي = ResponseFile (Page.Request، Page.Response، "filename"، @"C:download.date"، 1024000)؛
إذا (! النجاح)
Response.Write("حدث خطأ أثناء تنزيل الملف!");
Page.Response.End();