【问题标题】:force download file from s3 url强制从 s3 url 下载文件
【发布时间】:2022-08-04 16:09:58
【问题描述】:
我有一个 s3 URL,URL 中没有文件扩展名。
有什么办法可以直接从 URL 强制下载文件
https://s3-external-1.amazonaws.com/media.twiliocdn.com/AC451bab3cca7e01e20ee6bf1e746bed1f/10b62b6d5fe2f69be39840ce1201a2e7
在数据库中,我存储此 URL 以显示图像或任何文件,但现在我需要单击下载按钮在用户系统中下载此图像
仅供参考:这不是我们的 s3 存储桶,而是存储我们媒体的 Twilio 服务存储桶。
标签:
php
laravel
twilio
laravel-8
【解决方案1】:
您可以将图像临时存储在文件系统中,然后将其作为下载响应发送。
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
$response = Http::get(
'https://s3-external-1.amazonaws.com/media.twiliocdn.com/AC451bab3cca7e01e20ee6bf1e746bed1f/10b62b6d5fe2f69be39840ce1201a2e7'
);
file_put_contents($file = '/tmp/' . Str::uuid(), $response->body());
preg_match('/filename=\"(.+)\"/', $response->header('content-disposition'), $matches);
return response()->download($file, $matches[1], [
'Content-Type' => $response->header('content-type'),
])->deleteFileAfterSend();
【解决方案2】:
最后,在投入了这么多小时后,我找到了解决方案。
public function download($media){
$name = now()->format('m-d-Y-h:i:s') . '.' . Illuminate\Http\Testing\MimeType::search($media->content_type);
return response()->streamDownload(function () use ($media){
echo file_get_contents($media->url);
}, $name);
}
【解决方案3】:
从您的控制器,您可以返回一个下载响应,让您指定一个具有自定义名称的文件。像这样...
return response()
->download(
$file,
'download.jpeg',
);