I am unable to find, how to read filename from content disposition in angular 2 documentation. Can someone guide read the headers from server in angular 2content headers
9 Answers
With new Angular Http, one can try the following in the Service code.
downloadLink(): Observable<HttpResponse<Blob>> {
return this.http.get<Blob>(this.someURL, {
observe: 'response',
responseType: 'blob' as 'json'
});
}
And use the above as
this.someService
.downloadLink()
.subscribe(
(resp: HttpResponse<Blob>) => {
console.log(resp.headers.get('content-disposition'));
data = resp.body
});
Also, on the server side, one needs to set the following header in response. 'Access-Control-Expose-Headers': 'Content-Disposition'
Like in Java Spring Boot one can do the same using
final HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=1.xlsx");
headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION);

- 8,671
- 9
- 37
- 52
-
Thanks Nehal! This helped me. I was not exposing headers in response. – Shiv Dec 16 '19 at 10:29
-
adding `observe: 'response'` makes my zip file corrupted – Sanal S Mar 20 '20 at 11:19
-
adding response type corrupting data – Sunil Garg May 18 '20 at 14:48
-
4added on the server side as well,this is what i get in header keys `["cache-control", "content-length", "content-type", "expires", "pragma"]` but in browser `ACCESS_CONTROL_EXPOSE_HEADERS: CONTENT_DISPOSITION` and `CONTENT_DISPOSITION: abc.xml` is present in my response headers – Sunil Garg May 18 '20 at 15:05
-
1for .NET Core `app.Use((ctx, next) => { ctx.Response.Headers.Add("Access-Control-Expose-Headers", "*");` – Cyclion Aug 03 '20 at 08:00
To those complaining that the best solution is not working, and only content-type is in the headers, you need to set 'Access-Control-Expose-Headers': 'Content-Disposition' ON SERVER SIDE. I am using asp.net core, then I have to do the following.
app.UseCors(builder =>
builder.WithOrigins(originsAllowed.ToArray())
.AllowAnyMethod()
.AllowAnyHeader()
.WithExposedHeaders("Content-Disposition")

- 47,830
- 31
- 106
- 135

- 724
- 7
- 15
In angular, we can read File Name like as show below,
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);
});
But the main thing is that we need to specify Access-Control-Expose-Header in API as shown below,
Note: The last line is mandatory
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");

- 968
- 11
- 21
-
1Please note that the code above is missing a replacement for the quotes which appear if the filename has custom characters in the name. You should add .replace(/\"/g, '') after .trim() – Tom Jul 28 '20 at 14:05
-
This will only work if the filename is the [1] element in the disposition string. – Kris Boyd Apr 14 '21 at 03:52
You can try this kind of code here.
Note: Do not use map
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');
});

- 4,222
- 8
- 24
- 34

- 10,936
- 20
- 59
- 84
-
Thanks @Partha Sarathi Ghosh for your great reply, it also seems to be working with map method – Sahil Agarwal Mar 20 '17 at 09:16
-
-
34
-
4
-
res.headers is undefined for me, but I can find filename in content-disposition of header – swati bohidar Jul 29 '21 at 13:01
With Angular 9 and Expresss
Need to Allow this header in Express
res.setHeader('Access-Control-Expose-Headers', 'Content-Disposition');
Angular
this.http.get(url, { observe: 'response', responseType: 'blob' as 'json' })
.subscribe((res: any) => {
console.log(res.headers.get('content-disposition'));
});

- 787
- 1
- 8
- 16
-
1for .NET Core `app.Use((ctx, next) => { ctx.Response.Headers.Add("Access-Control-Expose-Headers", "*"); ` – Cyclion Aug 03 '20 at 08:03
In Angular 7 the up-voted method don't work, you need to do it like this :
const responseHeaderFilename = response.headers.get('content-disposition');
Please find Angular official docs for more details: https://angular.io/guide/http#reading-the-full-response
and also make sure that the "Content-Disposition" is exposed as in @mslugx answer

- 608
- 6
- 11
To get the filename from response header.
(data)=>{ //the 'data' is response of file data with responseType: ResponseContentType.Blob.
let filename = data.headers.get('content-disposition').split(';')[1].split('=')[1].replace(/\"/g, '')
}

- 2,331
- 23
- 25
-
1This will only work if the filename is the [1] element in the disposition string. – Kris Boyd Apr 14 '21 at 03:51
-
Alternative : `decodeURI(response.headers.get('content-disposition')?.match(/(?<=filename(?:=|\*=(?:[\w\-]+'')))["']?(?
[^"';\n]+)["']?/g)?.pop()?.replace(/\"/g, ''))` – OMANSAK Feb 02 '22 at 13:33
CORS requests only expose 6 headers :
- Cache-Control
- Content-Language
- Content-Type Expires
- Last-Modified & Pragma.
In order to access custom headers with a CORS request, the server has to explicitly whitelist them. This can be done by sending the response header: Access-Control-Expose-Headers
Java : addExposedHeader https://docs.spring.io/spring-framework/docs/4.2.x/javadoc-api/org/springframework/web/cors/CorsConfiguration.html
.NET CORE : WithExposedHeaders https://learn.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-6.0
Express JS : exposedHeaders https://expressjs.com/en/resources/middleware/cors.html

- 1,066
- 1
- 12
- 30
Angular 12 with parsing of the file name.
const saveAsWithServerName = (response: HttpResponse<Blob>, defaultName = 'NoName.pdf') => {
const fileName = response.headers
.get('content-disposition')
.split(';')
.map(h => h.trim())
.filter(h => h.startsWith('filename='))
.reduce(h => h.length === 1 ? h[0] : defaultName)
.replace('filename=', '');
saveAs(response.body, fileName);
};
this.http.post(`./api/ReportPdf`, request, {observe: 'response', responseType: 'blob'}).subscribe({
next: r => saveAsWithServerName(r)
});

- 1,643
- 15
- 16