import { AsyncPipe, NgTemplateOutlet } from '@angular/common'
-import { HttpClient } from '@angular/common/http'
+import { HttpClient, HttpResponse } from '@angular/common/http'
import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'
import {
FormArray,
this.documentId,
original
)
- this.http.get(downloadUrl, { responseType: 'blob' }).subscribe({
- next: (blob) => {
- this.downloading = false
- const blobParts = [blob]
- const file = new File(
- blobParts,
- original
- ? this.document.original_file_name
- : this.document.archived_file_name,
- {
- type: original ? this.document.mime_type : 'application/pdf',
- }
- )
- if (
- !this.deviceDetectorService.isDesktop() &&
- navigator.canShare &&
- navigator.canShare({ files: [file] })
- ) {
- navigator.share({
- files: [file],
+ this.http
+ .get(downloadUrl, { observe: 'response', responseType: 'blob' })
+ .subscribe({
+ next: (response: HttpResponse<Blob>) => {
+ const filename = response.headers
+ .get('Content-Disposition')
+ ?.split(';')
+ ?.find((part) => part.trim().startsWith('filename='))
+ ?.split('=')[1]
+ ?.replace(/['"]/g, '')
+ const blob = new Blob([response.body], {
+ type: response.body.type,
})
- } else {
- const url = URL.createObjectURL(blob)
- const a = document.createElement('a')
- a.href = url
- a.download = this.document.title
- a.click()
- URL.revokeObjectURL(url)
- }
- },
- error: (error) => {
- this.downloading = false
- this.toastService.showError(
- $localize`Error downloading document`,
- error
- )
- },
- })
+ this.downloading = false
+ const file = new File([blob], filename, {
+ type: response.body.type,
+ })
+ if (
+ !this.deviceDetectorService.isDesktop() &&
+ navigator.canShare &&
+ navigator.canShare({ files: [file] })
+ ) {
+ navigator.share({
+ files: [file],
+ })
+ } else {
+ const url = URL.createObjectURL(blob)
+ const a = document.createElement('a')
+ a.href = url
+ a.download = filename
+ a.click()
+ URL.revokeObjectURL(url)
+ }
+ },
+ error: (error) => {
+ this.downloading = false
+ this.toastService.showError(
+ $localize`Error downloading document`,
+ error
+ )
+ },
+ })
}
hasNext() {
# RFC 5987 addresses this issue
# see https://datatracker.ietf.org/doc/html/rfc5987#section-4.2
# Chromium cannot handle commas in the filename
- filename_normalized = normalize("NFKD", filename.replace(",", "_")).encode(
- "ascii",
- "ignore",
+ filename_normalized = (
+ normalize("NFKD", filename.replace(",", "_"))
+ .encode(
+ "ascii",
+ "ignore",
+ )
+ .decode("ascii")
)
filename_encoded = quote(filename)
content_disposition = (