Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.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
在Angular 8中从web.api下载文件时从服务器获取文件名_Angular_Asp.net Core Webapi_Angular8 - Fatal编程技术网

在Angular 8中从web.api下载文件时从服务器获取文件名

在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}/

我从Angular 8应用程序中的web.api(.net core)获取了一个文件,但无法从服务器获取文件名。。。如果我查看Fiddler中的响应,那么我可以在响应头(内容配置)中看到文件名

我的服务中有以下方法:

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标头,以便您的自定义标头向客户端公开。@当您从客户端向服务器发出请求时,jonrsharpe
Access 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'));
    });
}