How to limit bandwidth and allow multiple downloads when downloading a file? How to limit bandwidth and allow multiple downloads when downloading a file? multithreading multithreading

How to limit bandwidth and allow multiple downloads when downloading a file?


It seems that Google Chrome handles a download with a unique URL, so when I try to access the same URL it doesn't even run the action.

By adding anything to the URL, ex:

home/download?x=1home/download?x=2home/download?x=3

Chrome will think it is a different download and get it. So, to download a file, even if a different generated file every time, we need to change the URL.

And as for the throttle I created a FileThrottleResult which inherits from FilePathResult:

using System;using System.IO;using System.Threading;using System.Web.Mvc;namespace Mvc3Test{    public class FileThrottleResult : FilePathResult    {        float rate = 0;        /// <summary>        ///         /// </summary>        /// <param name="fileName"></param>        /// <param name="contentType"></param>        /// <param name="rate">Kbps</param>        public FileThrottleResult(string fileName, string contentType, float rate)            : base(fileName, contentType)        {            if (!File.Exists(fileName))            {                throw new ArgumentNullException("fileName");            }            this.rate = rate;        }        protected override void WriteFile(System.Web.HttpResponseBase response)        {            int _bufferSize = (int)Math.Round(1024 * this.rate);            byte[] buffer = new byte[_bufferSize];            Stream outputStream = response.OutputStream;            using (var stream = File.OpenRead(FileName))            {                response.AddHeader("Cache-control", "private");                response.AddHeader("Content-Type", "application/octet-stream");                response.AddHeader("Content-Length", stream.Length.ToString());                response.AddHeader("Content-Disposition", String.Format("filename={0}", new FileInfo(FileName).Name));                response.Flush();                while (true)                {                    if (!response.IsClientConnected)                        break;                    int bytesRead = stream.Read(buffer, 0, _bufferSize);                    if (bytesRead == 0)                        break;                    outputStream.Write(buffer, 0, bytesRead);                    response.Flush();                    Thread.Sleep(1000);                }            }        }    }}

Usage:

public FileThrottleResult Download(){    string testFile = @"C:\hugefile.zip";    return new FileThrottleResult(testFile, "application/octet-stream", 200);}

This will successfully limit the bandwidth and will not have problems with simultaneous downloads of the same file, as long as you trick the browser with a "different" url.