【问题标题】:Angular download file after POST requestPOST请求后的角度下载文件
【发布时间】:2018-04-11 15:40:21
【问题描述】:

我在一个 asp.net 核心应用程序上有几个导出路由,但所有这些路由都通过 GET 请求访问,例如:/api/{projectid}/{parameter}

这些请求正在生成 xlsx 文件并将它们发送到客户端。现在我有一个类似的请求,但是我必须将一个长数组传递给该方法,所以我想将它变成一个 POST 方法并在 http 正文中发送数组(和其他参数)。

我从服务器得到了正确的响应(一个以 PK 开头的数组缓冲区...),但我不能告诉 Angular 将它保存为文件,就像我对类似的 GET 请求所做的那样。如果我将其重写以启动 GET 请求,则它可以正常工作。我做错了什么?

控制器方法:

[HttpPost("[action]")]
public IActionResult Export([FromBody] DistributionExportPostModel model)
{
    var project = _ctx.Projects.FirstOrDefault(x=>x.Id == model.ProjectId);
    byte[] xlsx = createXlsxFile(project, model.Selection, model.ComparisonBase);
    var mimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    var fileName = $"TaskExport-"+project.Name+"-"+DateTime.Now.ToString("yyyyMMddHHmmss")+".xlsx";

    return File(xlsx, mimeType, fileName);
}   

Angular 提供者方法:

export(projectid:string, selection:string[], comparisonBase:string):Promise<any[]> {
        //let headers:Headers = new Headers();
        //headers.append('Accept', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

        //let params: URLSearchParams = new URLSearchParams();

        let requestOptions = new RequestOptions();
        requestOptions.responseType = ResponseContentType.ArrayBuffer;
        return new Promise<any[]>((resolve) =>
            this.http.post('/api/Distribution/Export', {
                //'+projectid+'/'+comparisonBase+'/'+selection.join(','),
                'ProjectId': projectid,
                'Selection': selection,
                'ComparisonBase': comparisonBase
            }, requestOptions).subscribe((res) => {
                window.open(res.url, '_blank');
                resolve();
            })
        );
    }    

【问题讨论】:

    标签: c# asp.net-mvc angular typescript asp.net-core


    【解决方案1】:

    下面应该可以在 Chrome 上运行。

    var blob = new Blob(yourData, {type: "octet/stream"});
    var url = window.URL.createObjectURL(blob);
    a.href = url;
    a.download = name;
    a.click();
    window.URL.revokeObjectURL(url);
    

    对于 IE 和 Firefox,试试这个:

    window.navigator.msSaveBlob(blob, filename);
    

    您可能需要在单击之前将锚点添加到 DOM。

    【讨论】:

      猜你喜欢
      • 2016-03-05
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      相关资源
      最近更新 更多