在Angular 8中从web.api下载文件时从服务器获取文件名
我从Angular 8应用程序中的web.api(.net core)获取了一个文件,但无法从服务器获取文件名。。。如果我查看Fiddler中的响应,那么我可以在响应头(内容配置)中看到文件名 我的服务中有以下方法:在Angular 8中从web.api下载文件时从服务器获取文件名,angular,asp.net-core-webapi,angular8,Angular,Asp.net Core Webapi,Angular8,我从Angular 8应用程序中的web.api(.net core)获取了一个文件,但无法从服务器获取文件名。。。如果我查看Fiddler中的响应,那么我可以在响应头(内容配置)中看到文件名 我的服务中有以下方法: public getAsCsv(taskId: number): Observable<HttpResponse<Blob>> { return this.httpClient.get<Blob>(`${this.apiBaseUrl}/
public getAsCsv(taskId: number): Observable<HttpResponse<Blob>> {
return this.httpClient.get<Blob>(`${this.apiBaseUrl}/getAsCsv/${taskId}`, {
observe: 'response',
responseType: 'blob' as 'json'
});
}
public getAsCsv(taskId:number):可观察{
返回此.httpClient.get(`${this.apiBaseUrl}/getAsCsv/${taskId}`{
观察:'回应',
responseType:'blob'作为'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);
});
}
公共导出(taskSmall:taskSmall){
this.taskApiService.getAsCsv(tasksall.id).subscribe((resp:HttpResponse)=>{
console.log(resp.headers.get('Content-Disposition');//正在控制台中写入null
const filename=resp.headers.get('Content-Disposition');
另存为(分别为正文、文件名);
});
}
我的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;
}
[HttpGet(“getAsCsv/{taskId}”)]
[授权(角色=RoleConstants.Admin)]
公共异步任务GetAsCsv(int taskId)
{
var result=wait_mediator.Send(新的GetTaskAsCsvCommand(taskId),CancellationToken.None);
byte[]byteArray=Encoding.ASCII.GetBytes(result.Value);
var响应=文件(byteArray,“应用程序/csv”);
response.FileDownloadName=“something.csv”;
返回响应;
}
如果我试图从标题中获取参数“Content Type”,它将显示正确的值(application/csv)
我做错了什么
由于@Plochie的更新,我最终做到了这一点:
API:
[HttpGet(“getAsCsv/{taskId}”)]
[授权(角色=RoleConstants.Admin)]
公共异步任务GetAsCsv(int taskId)
{
var result=wait_mediator.Send(新的GetTaskAsCsvCommand(taskId),CancellationToken.None);
byte[]byteArray=Encoding.ASCII.GetBytes(result.Value);
添加(“x-file-name”,“something.csv”);
添加(“访问控制公开标题”、“x文件名”);
返回文件(byteArray,“应用程序/csv”);
}
客户:
public export(taskSmall: TaskSmall) {
this.taskApiService.getAsCsv(taskSmall.id).subscribe((resp: HttpResponse<Blob>) => {
saveAs(resp.body, resp.headers.get('x-file-name'));
});
}
公共导出(taskSmall:taskSmall){
this.taskApiService.getAsCsv(tasksall.id).subscribe((resp:HttpResponse)=>{
saveAs(resp.body、resp.headers.get('x-file-name');
});
}
发送响应时,您可能没有公开此标题。您的服务器需要发送Access-Control-Expose-header
header,以便向客户端公开您的头
在这里,您可以公开内容处置
标题,或创建自己的自定义标题x-file-name
,将文件名作为值,并公开此自定义标题
文件:
[HttpGet(“getAsCsv/{taskId}”)]
[授权(角色=RoleConstants.Admin)]
公共异步任务GetAsCsv(int taskId)
{
var result=wait_mediator.Send(新的GetTaskAsCsvCommand(taskId),CancellationToken.None);
byte[]byteArray=Encoding.ASCII.GetBytes(result.Value);
添加(“x-file-name”,“something.csv”);
添加(“访问控制公开标题”、“x文件名”);
返回文件(byteArray,“application/csv”,“something.csv”);
}
您可以共享API返回的响应吗?您可能在发送响应时没有公开此标头。您的服务器需要发送Access Control Expose Headers标头,以便您的自定义标头向客户端公开。@当您从客户端向服务器发出请求时,jonrsharpeAccess Control Allow Headers
会进入。我认为这里需要accesscontrol-Expose-Headers
。我说得通吗?@Plochie你说得对,谢谢;我以为我是对的。@NicholasK我已经用我的api方法更新了这个问题,我使用了这个方法:Response.Headers.Add(“访问控制暴露标题”,“内容处置”);现在我得到了:依恋;filename=something.csv;文件名*=UTF-8“something.csv。我可以做一些字符串破解吗?我可以更容易地得到文件名吗?你只能从服务器上得到你正在发送的信息。因此,如果您想要自定义的内容,请在发送响应时添加一些自定义标题,比如x-file-name
。在访问控制公开标题中添加此标题,并在前端获取此标题。我添加了Response.Headers.add(“x-file-name”,“somethingNew.csv”);我可以在响应中看到它,但在我的角度代码中找不到:console.log(resp.headers.get('x-file-name'));您是否添加了HttpContext.Response.AddHeader(“访问控制公开头”,“x-file-name”)代码>?
public export(taskSmall: TaskSmall) {
this.taskApiService.getAsCsv(taskSmall.id).subscribe((resp: HttpResponse<Blob>) => {
saveAs(resp.body, resp.headers.get('x-file-name'));
});
}