Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
下载压缩文件PushStreamContent Javascript_Javascript_C#_Asp.net_Vue.js_.net Framework Version - Fatal编程技术网

下载压缩文件PushStreamContent Javascript

下载压缩文件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

我正在询问如何正确地下载Post请求中的
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请求,并通过响应将其发送到软件包,这真是太棒了,可以立即开始下载

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


只有在浏览资源时才能进行下载。这意味着您不能使用ajax(xhr、fetch、axios等)触发下载
location.href=
都可以正常工作,但是如果您确实需要它作为post请求,那么您也可以提交
,但您必须使用
应用程序/多部分
URLCoded
来完成,而不是使用json请求或其他任何东西。这样做的缺点是,您不能像身份验证头那样使用自定义请求头(除非您使用服务工作者添加它们) 在这种情况下,最好使用随每个请求一起发送的cookie