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.