我从Angular 8应用程序中的web.api(.net核心)获取文件,但是我无法从服务器获取文件名...如果我在Fiddler中查看响应,则可以看到响应头(Content-Disposition)中的文件名。
我在服务中使用以下方法:
public getAsCsv(taskId: number): Observable<HttpResponse<Blob>> {
return this.httpClient.get<Blob>(`${this.apiBaseUrl}/getAsCsv/${taskId}`, {
observe: 'response',
responseType: 'blob' as 'json'
});
}
在我的组件中,我有以下代码:
public export(taskSmall: TaskSmall) {
this.taskApiService.getAsCsv(taskSmall.id).subscribe((resp: HttpResponse<Blob>) => {
console.log(resp.headers.get('Content-Disposition')); // is writing null in the console
const filename = resp.headers.get('Content-Disposition');
saveAs(resp.body, filename);
});
}
我的Web API方法如下所示:
[HttpGet("getAsCsv/{taskId}")]
[Authorize(Roles = RoleConstants.Admin)]
public async Task<IActionResult> GetAsCsv(int taskId)
{
var result = await _mediator.Send(new GetTaskAsCsvCommand(taskId), CancellationToken.None);
byte[] byteArray = Encoding.ASCII.GetBytes(result.Value);
var response = File(byteArray, "application/csv");
response.FileDownloadName = "something.csv";
return response;
}
如果我尝试从标题中获取参数“ Content-Type”,它将显示正确的值(application / csv)。
我究竟做错了什么?
更新感谢@Plochie,我最终做到了:
API:
[HttpGet("getAsCsv/{taskId}")]
[Authorize(Roles = RoleConstants.Admin)]
public async Task<IActionResult> GetAsCsv(int taskId)
{
var result = await _mediator.Send(new GetTaskAsCsvCommand(taskId), CancellationToken.None);
byte[] byteArray = Encoding.ASCII.GetBytes(result.Value);
Response.Headers.Add("x-file-name", "something.csv");
Response.Headers.Add("Access-Control-Expose-Headers", "x-file-name");
return File(byteArray, "application/csv"); ;
}
客户:
public export(taskSmall: TaskSmall) {
this.taskApiService.getAsCsv(taskSmall.id).subscribe((resp: HttpResponse<Blob>) => {
saveAs(resp.body, resp.headers.get('x-file-name'));
});
}
发送响应时,您可能尚未公开此标头。您的服务器需要发送Access-Control-Expose-Headers
标头,以便您的标头公开给客户端。
在这里,您可以公开Content-Disposition
标题或x-file-name
使用文件名作为值创建自己的自定义标题,然后公开此自定义标题。
说明文件:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Expose-Headers
[HttpGet("getAsCsv/{taskId}")]
[Authorize(Roles = RoleConstants.Admin)]
public async Task<IActionResult> GetAsCsv(int taskId)
{
var result = await _mediator.Send(new GetTaskAsCsvCommand(taskId), CancellationToken.None);
byte[] byteArray = Encoding.ASCII.GetBytes(result.Value);
Response.Headers.Add("x-file-name", "something.csv");
Response.Headers.Add("Access-Control-Expose-Headers", "x-file-name");
return File(byteArray, "application/csv", "something.csv"); ;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句