У меня есть Angular 7 Frontend, и я пытаюсь загрузить файл PDF из API Laravel 5.8. К сожалению, это не работает. Обычно это можно сделать так?
Код следующий:
download(document) {
this.apiService.downloadDocument(document).subscribe((document) => {
this.notification.success('Download started.');
}, error1 => console.log(error1));
}
Теперь я попробовал его с двумя вариантами:
Вариант 1: без заголовков
downloadDocument(document): Observable<any> {
return this.httpClient.post<any>(`${this.PHP_API_SERVER}/downloadDocument`, document)
}
Параметр2: с заголовками
downloadDocument(document): Observable<any> {
let headers = new HttpHeaders();
headers = headers.set('Accept', 'application/pdf');
return this.httpClient.post<any>(`${this.PHP_API_SERVER}/downloadDocument`, document, {headers: headers})
}
Теперь часть Backend:
public function downloadDocument(Request $request)
{
try {
return Storage::download($request->name_hash); // name_hash is the path to the file
} catch (QueryException $e) {
return response()->json($e, Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
Забавно то, что это работает, потому что я вижу PDF на вкладке сети в инструментах разработчика впредварительный просмотр есть (я думаю, декодированный?) PDF. Выглядит это так:
%PDF-1.4
%äüöÃ
2 0 obj
<</Length 3 0 R/Filter/FlateDecode>>
stream
xU˪ãFÝû+z°§«ú
[...]
Но загрузка не начинается! Файл console.log в «error1» в моем коде выше просто говорит:
OK
Я не знаю, слишком ли это много, но здесь также есть заголовки запроса и ответа.
Заголовки ответа:
access-control-allow-headers: Content-Type, Accept, Authorization, X-Requested-With, Application
access-control-allow-methods: POST, GET, OPTIONS, PUT, DELETE
access-control-allow-origin: *
cache-control: private, must-revalidate
content-disposition: attachment; filename=rD1579koch77OUIfnPZmnJaIgDUnUMSINaYGdKO8.pdf
content-length: 212677
content-type: application/pdf
date: Sun, 10 Nov 2019 19:37:14 GMT
expires: -1
pragma: no-cache
server: nginx
status: 200
vary: Authorization
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
Заголовки запроса:
:authority: api.myapi.de
:method: POST
:path: /api/downloadDocument
:scheme: https
accept: application/json, text/plain, */*
accept-encoding: gzip, deflate, br
accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7,nl;q=0.6
authorization: Bearer [my-token-is-here]
content-length: 224
content-type: application/json
origin: http://localhost:4200
referer: http://localhost:4200/
sec-fetch-mode: cors
sec-fetch-site: cross-site
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36