如何从服务器响应角度2读取内容处置标头

Sah*_*wal 5 typescript angular

我无法找到,如何从角度2文档中的内容配置中读取文件名.有人可以指导从角度2 内容标题中的服务器读取标题

msl*_*ugx 14

对于抱怨最佳解决方案不起作用且只有内容类型在标题中的人,您需要在服务器端设置"访问控制 - 公开 - 标题":"内容 - 处置".我使用的是asp.net核心,然后我必须做以下事情.

app.UseCors(builder =>
                builder.WithOrigins(originsAllowed.ToArray())
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .WithExposedHeaders("Content-Disposition")
Run Code Online (Sandbox Code Playgroud)


Neh*_*nia 14

使用新的Angular Http,可以在Service代码中尝试以下操作。

  downloadLink(): Observable<HttpResponse<Blob>> {
    return this.http.get<Blob>(this.someURL, {
      observe: 'response',
      responseType: 'blob' as 'json'
    });
  }
Run Code Online (Sandbox Code Playgroud)

并使用上面的作为

 this.someService
  .downloadLink()
  .subscribe(
    (resp: HttpResponse<Blob>) => {
      console.log(resp.headers.get('content-disposition'));
      data = resp.body
    });
Run Code Online (Sandbox Code Playgroud)

同样,在服务器端,作为响应,需要设置以下标头。 'Access-Control-Expose-Headers': 'Content-Disposition'

就像在Java Spring Boot中一样,可以使用

    final HttpHeaders headers = new HttpHeaders();
    headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=1.xlsx");
    headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION);
Run Code Online (Sandbox Code Playgroud)

  • 也在服务器端添加,这就是我在标头键 `["cache-control", "content-length", "content-type", "expires", "pragma"]` 中得到的内容,但在浏览器中 `ACCESS_CONTROL_EXPOSE_HEADERS : CONTENT_DISPOSITION` 和 `CONTENT_DISPOSITION: abc.xml` 出现在我的响应标头中 (4认同)

Cha*_*Y S 14

在 angular 中,我们可以读取文件名,如下所示,

  this.http.post(URL, DATA).subscribe(
        (res) => {
            var contentDisposition = res.headers.get('content-disposition');
            var filename = contentDisposition.split(';')[1].split('filename')[1].split('=')[1].trim();
            console.log(filename);
        });
Run Code Online (Sandbox Code Playgroud)

但主要是我们需要在API中指定Access-Control-Expose-Header,如下所示,

注意:最后一行是必填的

FileInfo file = new FileInfo(FILEPATH);

HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = file.Name
};
response.Content.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
Run Code Online (Sandbox Code Playgroud)

  • 请注意,上面的代码缺少对引号的替换,如果文件名中包含自定义字符,则会出现引号。您应该在 .trim() 之后添加 .replace(/\"/g, '') (2认同)

Par*_*osh 13

你可以在这里尝试这种代码.

注意:不要使用地图

this.http.post(URL, DATA)
  .subscribe((res) => {
     var headers = res.headers;
     console.log(headers); //<--- Check log for content disposition
     var contentDisposition= headers.get('content-disposition');
});
Run Code Online (Sandbox Code Playgroud)

  • 不适合我.标题中只包含内容类型 (10认同)
  • 也不适合我。只有内容类型在标题中 (4认同)

Ric*_*ado 5

使用 Angular 9 和 Expresss

需要在 Express 中允许此标头

res.setHeader('Access-Control-Expose-Headers', 'Content-Disposition');
Run Code Online (Sandbox Code Playgroud)

this.http.get(url, { observe: 'response', responseType: 'blob' as 'json' })
.subscribe((res: any) => {
    console.log(res.headers.get('content-disposition'));
});
Run Code Online (Sandbox Code Playgroud)