Mvc - 如何以 4k 块流式传输大文件以供下载
Mvc - How to stream large file in 4k chunks for download
我一直在关注这个例子,但是当下载开始时它挂起,一分钟后它显示服务器错误。我想响应在所有数据 ID 发送到客户端之前结束。
你知道我可以这样做的另一种方法吗?或者为什么它不起作用?
Writing to Output Stream from Action
private void StreamExport(Stream stream, System.Collections.Generic.IList<byte[]> data)
{
using (BufferedStream bs = new BufferedStream(stream, 256 * 1024))
using (StreamWriter sw = new StreamWriter(bs))
{
foreach (var stuff in data)
{
sw.Write(stuff);
sw.Flush();
}
}
}
能给个调用方法吗?传入的 Stream 是什么?是响应流吗?
有许多有用的 类 可以使用,您不必因为它们默认分块而放弃自己。如果您使用 StreamContent ,则存在构造函数重载,您可以在其中指定缓冲区大小。我相信默认是 10kB。
凭记忆写在这里,可能还不够完整:
[Route("download")]
[HttpGet]
public async Task<HttpResponseMessage> GetFile()
{
var response = this.Request.CreateResponse(HttpStatusCode.OK);
//don't use a using statement around the stream because the framework will dispose StreamContent automatically
var stream = await SomeMethodToGetFileStreamAsync();
//buffer size of 4kB
var content = new StreamContent(stream, 4096);
response.Content = content;
return response;
}
我一直在关注这个例子,但是当下载开始时它挂起,一分钟后它显示服务器错误。我想响应在所有数据 ID 发送到客户端之前结束。
你知道我可以这样做的另一种方法吗?或者为什么它不起作用?
Writing to Output Stream from Action
private void StreamExport(Stream stream, System.Collections.Generic.IList<byte[]> data)
{
using (BufferedStream bs = new BufferedStream(stream, 256 * 1024))
using (StreamWriter sw = new StreamWriter(bs))
{
foreach (var stuff in data)
{
sw.Write(stuff);
sw.Flush();
}
}
}
能给个调用方法吗?传入的 Stream 是什么?是响应流吗?
有许多有用的 类 可以使用,您不必因为它们默认分块而放弃自己。如果您使用 StreamContent ,则存在构造函数重载,您可以在其中指定缓冲区大小。我相信默认是 10kB。
凭记忆写在这里,可能还不够完整:
[Route("download")]
[HttpGet]
public async Task<HttpResponseMessage> GetFile()
{
var response = this.Request.CreateResponse(HttpStatusCode.OK);
//don't use a using statement around the stream because the framework will dispose StreamContent automatically
var stream = await SomeMethodToGetFileStreamAsync();
//buffer size of 4kB
var content = new StreamContent(stream, 4096);
response.Content = content;
return response;
}