下载Zip文件PushStreamContent Javascript



我正在询问下载Post Request中的PushStreamContent的正确方法,我已经预先准备了后端请求,类似于这个

private static HttpClient Client { get; } = new HttpClient();
public HttpResponseMessage Get()
{
var filenamesAndUrls = new Dictionary<string, string>
{
{ 'README.md', 'https://raw.githubusercontent.com/StephenClearyExamples/AsyncDynamicZip/master/README.md' },
{ '.gitignore', 'https://raw.githubusercontent.com/StephenClearyExamples/AsyncDynamicZip/master/.gitignore'},
};
var result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new PushStreamContent(async (outputStream, httpContext, transportContext) =>
{
using (var zipStream = new ZipOutputStream(outputStream))
{
foreach (var kvp in filenamesAndUrls)
{
zipStream.PutNextEntry(kvp.Key);
using (var stream = await Client.GetStreamAsync(kvp.Value))
await stream.CopyToAsync(zipStream);
}
}
}),
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "MyZipfile.zip" };
return result;
}

在前面的部分,我使用axios发送Post请求,结果我创建了blob来下载它(我修改了后端以支持Post(但下载需要很多时间,我认为这是使用PushStreamContent的错误方式,我应该使用EventSource或类似的东西。

谢谢。

经过几天的搜索,有两个解决方案:

  • 将下载请求更改为Get-request,而不是Post
  • 使用Fetch而不是axios http请求,并通过响应将其发送到streamsaver包,这真的很神奇,可以立即开始下载

我同意houssem将其更改为get请求
我是StreamSaver的创建者,偶尔我会搜索谈论它的人,并帮助有需要的人。我经常不得不告诉ppl,与其使用StreamSaver,不如使用服务器来保存文件。StreamSaver适用于客户端生成的内容(适用于WebTorrent或网络摄像头录制等内容(


只有在浏览资源时才能进行下载。这意味着不能使用ajax(xhr、fetch、axios等(来触发下载
<a href><iframe>location.href =都很好,但如果你真的需要它作为发布请求,那么你也可以提交<form>,但你必须使用application/multipartURLEncoded,而不是使用json请求或其他任何东西。这样做的缺点是,您不能像身份验证头那样使用自定义请求头(除非您使用serviceworker添加它们(在这种情况下,最好使用每次请求都会发送的cookie

最新更新