开机自检请求后的角度下载文件



我在 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);
}   

角度提供者方法:

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();
            })
        );
    }    

下面应该适用于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,然后再单击它。

最新更新