Posted on: September 21, 2021 05:53 PM
Posted by: Renato
Views: 2698
Download S3 file links in Laravel
Estou criando API em ReactJs como frontend e Laravel como backend, onde estou enviando arquivos na minha seção de administração para meu aws-s3 enquanto envio os arquivos que estou armazenando o link desse arquivo no banco de dados. Cada ação é mantida por chamadas api, agora eu quero dar a opção desses downloads para meus usuários finais.
Estou querendo que retorne downlod_url.
Então por causa desta duvida achei umas dicas que vou compartilhar com vocês devs.
Este código abaixo funcionou perfeitamente para baixar do S3 no Laravel 8:
// $filePath should look like this: some-directory/filename.zip
return redirect(Storage::disk('s3')->temporaryUrl(
$filePath,
now()->addHour(),
['ResponseContentDisposition' => 'attachment']
));
Credits to: https://sutherlandboswell.com/force-file-download-from-aws-s3-in-laravel/
Outro exemplo:
se Illuminate\Support\Facades\Response as Download;
public function download_config(Config $config)
{
$headers = [
'Content-Type' => 'Content-Type: application/zip',
'Content-Disposition' => 'attachment; filename="'. $config->name .'"',
];
return Download::make(Storage::disk('s3')->get($config->path), Response::HTTP_OK, $headers);
}
Forçar download de arquivo do AWS S3 no Laravel
O S3 da Amazon é uma ótima solução para armazenar arquivos, e o Laravel torna-o fácil de usar. Ocasionalmente, você precisará forçar o download dos arquivos em vez de apenas mostrá-los no navegador, mas felizmente isso também é fácil! Em vez de desperdiçar os recursos do servidor para transmitir o arquivo do S3 para o usuário, usaremos URLs assinados .
Os URLs assinados podem dar a um usuário acesso temporário a um arquivo específico em seu depósito privado, portanto, só precisamos redirecionar para lá e dizer ao S3 para definir um cabeçalho extra. Em seu controlador responsável pelo download de arquivos, você só precisará retornar uma resposta como abaixo:
return redirect(Storage::disk('s3')->temporaryUrl(
$file->path,
now()->hour(),
['ResponseContentDisposition' => 'attachment']
));
Neste exemplo $file->path
está o caminho do meu arquivo no meu intervalo S3 e now()->addHour()
está criando um carimbo de data / hora Carbon uma hora no futuro, quando nosso URL assinado irá expirar. A parte importante é a ['ResponseContentDisposition' => 'attachment']
opção que informa ao S3 que nosso usuário deseja baixar o arquivo em vez de exibi-lo no navegador.
- https://stackoverflow.com/questions/52955643/download-s3-file-links-in-laravel
- https://laravel.com/docs/8.x/filesystem#temporary-urls
Credits to: https://sutherlandboswell.com/force-file-download-from-aws-s3-in-laravel/ (Sutherland Boswell)
Donate to Site
Renato
Developer