下载压缩文件PushStreamContent Javascript
我正在询问如何正确地下载Post请求中的下载压缩文件PushStreamContent Javascript,javascript,c#,asp.net,vue.js,.net-framework-version,Javascript,C#,Asp.net,Vue.js,.net Framework Version,我正在询问如何正确地下载Post请求中的PushStreamContent, 我已经预先准备了后端请求,类似这样的 private static HttpClient Client { get; } = new HttpClient(); public HttpResponseMessage Get() { var filenamesAndUrls = new Dictionary<string, string> { { 'README.md', 'https://raw
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;
}
private static HttpClient客户端{get;}=new HttpClient();
公共HttpResponseMessage Get()
{
var filenamesAndUrls=新字典
{
{'README.md','https://raw.githubusercontent.com/StephenClearyExamples/AsyncDynamicZip/master/README.md' },
{.gitignore','https://raw.githubusercontent.com/StephenClearyExamples/AsyncDynamicZip/master/.gitignore'},
};
var结果=新的HttpResponseMessage(HttpStatusCode.OK)
{
内容=新的PushStreamContent(异步(outputStream、httpContext、transportContext)=>
{
使用(var zipStream=新ZipOutputStream(outputStream))
{
foreach(filenamesandurl中的var kvp)
{
zipStream.PutNextEntry(kvp.Key);
使用(var stream=await Client.GetStreamAsync(kvp.Value))
等待流。CopyToAsync(zipStream);
}
}
}),
};
result.Content.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/八位字节流”);
result.Content.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”){FileName=“MyZipfile.zip”};
返回结果;
}
在前面的部分,我使用axios发送Post请求,结果我创建了blob来下载它(我修改了后端以支持Post)
但是下载要花很多时间,我认为这是使用PushStreamContent的错误方式,我应该使用EventSource或类似的东西
谢谢。经过几天的搜索,有两种解决方案:
- 将下载请求更改为获取请求而不是发布
- 使用Fetch代替axios http请求,并通过响应将其发送到软件包,这真是太棒了,可以立即开始下载
我是StreamSaver的创建者,偶尔我会搜索ppl来谈论它并帮助有需要的人。我经常不得不告诉ppl,最好使用服务器来保存文件,而不是使用StreamSaver。StreamSaver适用于客户端生成的内容(适用于WebTorrent或webcam录制等内容)
只有在浏览资源时才能进行下载。这意味着您不能使用ajax(xhr、fetch、axios等)触发下载
,
,location.href=
都可以正常工作,但是如果您确实需要它作为post请求,那么您也可以提交
,但您必须使用应用程序/多部分
或URLCoded
来完成,而不是使用json请求或其他任何东西。这样做的缺点是,您不能像身份验证头那样使用自定义请求头(除非您使用服务工作者添加它们)
在这种情况下,最好使用随每个请求一起发送的cookie