如何解决下载Zip文件PushStreamContent Javascript
我在询问有关取消发布请求中出现的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或类似的东西。
谢谢。
解决方法
经过几天的搜索,有两种解决方法:
- 将下载请求更改为“获取请求”,而不是“发布”。
- 使用Fetch代替axios http请求,并将响应发送到streamsaver包中,这真的很棒,可以立即开始下载。
我同意侯赛姆关于将其更改为获取请求的意见。
我是StreamSaver的创建者,有时我会搜索谈论它的ppl并帮助需要帮助的人。我经常不得不告诉ppl,使用服务器保存文件比使用StreamSaver更好。 StreamSaver适用于客户端生成的内容(适用于WebTorrent或网络摄像头录制之类的东西)
仅当您浏览资源时才能进行下载。这意味着您不能使用ajax (xhr,fetch,axios等)来触发下载<a href>
,<iframe>
,location.href =
都可以正常工作,但是如果您确实需要将其作为发帖请求,那么您也可以提交<form>
,但必须用application/multipart
或URLEncoded
来做,而不要用json请求或其他方法来做。这样做的缺点是您不能使用自定义请求标头(例如身份验证标头)(除非您使用Service Worker添加它们)
在这种情况下,最好将Cookie与每个请求一起发送
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。