gpt4 book ai didi

c# - 下载文件时如何限制带宽并允许多次下载?

转载 作者:可可西里 更新时间:2023-11-01 08:13:35 30 4
gpt4 key购买 nike

我有这段代码,它在一次只运行 1 个下载时有效

using (System.IO.FileStream fs = System.IO.File.OpenRead(@"C:\HugeFile.GBD"))
{
using (System.IO.BinaryReader br = new System.IO.BinaryReader(fs))
{
Response.AddHeader("Cache-control", "private");
Response.AddHeader("Content-Type", "application/octet-stream");
Response.AddHeader("Content-Length", fs.Length.ToString());
Response.AddHeader("Content-Disposition", "filename=HugeFile.GBD");
Response.Flush();
float kbs = 20f;

while (fs.Position < fs.Length)
{
if (!Response.IsClientConnected)
break;
byte[] bytes = br.ReadBytes((int)Math.Truncate(1024 * kbs));
char[] c = UTF8Encoding.Default.GetChars(bytes);

Response.Write(c, 0, c.Length);


Response.Flush();
System.Threading.Thread.Sleep(1000);
}
Response.Flush();
}
}

但是如果我同时建立两个连接(在同一个浏览器上开始第二次下载),第二个连接不会执行,直到第一个连接完成。

在将 header 添加到 Response 时,使用线程或任务会导致错误...

我怎样才能在同一个浏览器上同时执行 2+ 个下载?

最佳答案

Google Chrome 似乎使用唯一的 URL 处理下载,所以当我尝试访问相同的 URL 时,它甚至没有运行该操作。

通过向 URL 添加任何内容,例如:

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

Chrome会认为是不同的下载并获取。因此,要下载一个文件,即使每次生成的文件不同,我们也需要更改 URL。

至于 throttle ,我创建了一个继承自 FilePathResultFileThrottleResult:

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);
}
}
}
}
}

用法:

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

这将成功限制带宽,并且不会出现同时下载同一文件的问题,只要您使用“不同”的 url 欺骗浏览器。

关于c# - 下载文件时如何限制带宽并允许多次下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14076855/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com