In questo articolo tratteremo di un task in Laravel che riguarda la visualizzazione di file ottenuti da un'API remota ma che non dobbiamo memorizzare fisicamente nel file system.
Supponiamo di avere un metodo pubblico di un nostro componente che reperisce un file PDF da un'API remota e che ipoteticamente potrebbe avere questa implementazione.
public function getPDFAPIRequest(int $id)
{
$apiURL = config('pdf.api_url');
$apiToken = config('pdf.api_token');
$requestBody = [
'id' => $id,
'token' => $apiToken
];
$response = Http::asForm()->post($apiURL, $requestBody);
return $response->successful() ? $response->body() : null;
}
A questo punto abbiamo il contenuto del file PDF e dobbiamo mostrarlo nel browser dell'utente creando una rotta specifica. Dobbiamo però tenere presente che il file non verrà prima salvato localmente, quindi dobbiamo far ricorso alle funzionalità di stream dei file di Laravel per poter finalizzare il nostro task.
public function show($id)
{
$data = $this->getPDFAPIRequest($id);
if($data) {
return response()->stream(
fn () => print($data),
200,
[
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="file.pdf"',
]
);
}
}
In questo modo il file verrà visualizzato nel browser senza forzarne il download. Si tratta di una semplice soluzione che possiamo applicare quando usare l'helper file()
richiederebbe il salvataggio preventivo del file remoto nel file system.
Conclusione
In Laravel le funzionalità di stream delle risposte trovano il loro caso d'uso più significativo quando dobbiamo visualizzare file remoti nel browser senza dover effettuare prima il loro download.