【问题标题】:Streaming large file across multiple layers跨多个层流式传输大文件
【发布时间】:2020-01-13 16:24:36
【问题描述】:

大型 zip 文件(以千兆字节为单位)存储在 API 层中。当用户在浏览器中单击下载按钮时,请求会通过 WEB 层到达 API 层,作为回报,我们需要将大文件从 API 层流式传输到 WEB 层返回客户端浏览器。

请告知如何在不将文件写入 Web 应用程序的情况下将大文件从 API 应用程序流式传输到 WEB 应用程序到客户端?

Web 应用程序请求 API 应用程序使用 rest sharp 库,如果您能建议使用 rest sharp(或者本机代码)的解决方案,那就太好了。这两个项目都在 .NET core 2.2 中

【问题讨论】:

  • 直接返回来自API请求的响应流作为来自Web请求的响应。
  • 请评论反对投票的原因

标签: c# asp.net-core restsharp


【解决方案1】:

你在找DownloadData吗?

https://github.com/restsharp/RestSharp/blob/master/src/RestSharp/RestClient.Sync.cs#L23

以下直接来自docs中的例子:

var tempFile = Path.GetTempFileName();
using var writer = File.OpenWrite(tempFile);

var client = new RestClient(baseUrl);
var request = new RestRequest("Assets/LargeFile.7z");
request.ResponseWriter = responseStream =>
{
    using (responseStream)
    {
        responseStream.CopyTo(writer);
    }
};
var response = client.DownloadData(request);

【讨论】:

  • 如果它是一个正在流式传输文件并下载的层,这将起作用,但我需要从应用层读取文件并将其流式传输到 Web 层,从 Web 层我需要再次流式传输到客户
  • @Jemin 在这种情况下,只需创建一个新的MemoryStream 而不是FileStream,例如将using var writer = File.OpenWrite(tempFile); 替换为var writer = new MemoryStream();。当DownloadData 被调用时,这将填充MemoryStream,您可以将蒸汽返回给调用者。
【解决方案2】:

通过使用HttpClient而不是RestSharp库将内容直接下载到浏览器找到了解决方案

sn-p代码如下

HttpClient client = new HttpClient();
var fileName = Path.GetFileName(filePath);
var fileDowloadURL = $"API URL";

var stream = await client.GetStreamAsync(fileDowloadURL).ConfigureAwait(false);
// note that at this point stream only contains the header the body content is not read

return new FileStreamResult(stream, "application/octet-stream")
{
    FileDownloadName = fileName
};

【讨论】:

  • 如果您要从服务器流式传输到客户端并返回到服务器...至少是您放入其中一个 cmets 的内容...我建议使用 MemoryStream 而不是 FileStream。 ..它会表现得更好!
猜你喜欢
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多