Як завантажити файл на S3 за допомогою файлової системи Laravel
Нещодавно я опублікував статтю Завантажити файли на Amazon S3 за допомогою AWS PHP SDK. Один з наших читачів запитав, як виконувати операції з завантаженням файлів AWS S3 за допомогою Laravel. Коли мова заходить про Laravel, нам потрібно піти іншим шляхом, порівняно з PHP. У цій статті ми вивчаємо, як завантажити файл на S3 за допомогою файлової системи Laravel.
Файлова система Laravel надає різні драйвери для роботи з локальною файловою системою, Amazon S3, Rackspace тощо. Ці драйвери забезпечують зручний і простий спосіб завантаження файлів локально або в хмарі.
Amazon S3 – це популярна послуга для зберігання зображень, файлів та документів. По-друге, збереження файлів у хмарі значно заощадить пропускну здатність вашого веб-сайту. Це економить ваш простір на хостингу, а продуктивність хмари масштабована
Сказавши це, давайте подивимось, як завантажити файл на S3 за допомогою файлової системи Laravel.
Отримайте свої облікові дані безпеки AWS
Щоб розпочати роботу з S3, у вас повинен бути обліковий запис у Amazon Web Services. Після того, як ви його отримаєте, переконайтеся, що ви активували послугу S3.
Після активації служби S3 отримайте свої облікові дані безпеки, які нам знадобляться у подальшій частині навчального посібника.
S3 Driver Configuration in Laravel
Як вже було сказано, я буду використовувати файлову систему Laravel. Це вимагає налаштування драйвера S3. Зайдіть до редактора та відкрийте файл config/filesystems.php
. У цьому файлі ви можете побачити драйвер, визначений для S3, у розділі "диски".
config / filesystems.php
<?php
return [
.....
'disks' => [
.....
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
],
],
];
У наведеному вище коді Laravel використовує метод env() для встановлення значень. Це означає, що вам потрібно визначити ці константи у своєму .env
файлі. Вам не потрібно визначати константи AWS_URL та AWS_ENDPOINT, оскільки це не потрібно для завантаження файлів у сегмент S3.
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
AWS_BUCKET=
Додайте значення до кожної константи вище. Далі відкрийте термінал у кореневому каталозі проекту та запустіть команду:
composer require league/flysystem-aws-s3-v3 ~1.0
Ця команда встановить необхідну бібліотеку, яка викликає API AWS і виконує хмарні операції.
Завантажте файл на S3 в Laravel
Ми всі встановлюємо з базовою конфігурацією. Тепер ми можемо перейти до фактичної частини завантаження файлів. Давайте створимо просту форму з кнопкою введення файлу та кнопки подання.
Додайте наведений нижче код у свій файл леза.
<form action="{{ url('ROUTE_URL') }}" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="exampleInputFile">File input</label>
<input type="file" name="profile_image" id="exampleInputFile">
</div>
{{ csrf_field() }}
<button type="submit" class="btn btn-default">Submit</button>
</form>
Замініть заповнювач ROUTE_URL на дійсний маршрут.
Laravel надає Storage
фасад, який раніше взаємодіяв із налаштованими дисками. У нашому випадку це диск S3. Додайте Storage
фасад в контролер наступним чином:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesStorage;
...
...
Після включення фасаду ви можете завантажувати файли на S3. Напишіть код нижче у своєму методі, який надсилає файл на S3.
<?php
...
...
public function store(Request $request)
{
if($request->hasFile('profile_image')) {
//get filename with extension
$filenamewithextension = $request->file('profile_image')->getClientOriginalName();
//get filename without extension
$filename = pathinfo($filenamewithextension, PATHINFO_FILENAME);
//get file extension
$extension = $request->file('profile_image')->getClientOriginalExtension();
//filename to store
$filenametostore = $filename.'_'.time().'.'.$extension;
//Upload File to s3
Storage::disk('s3')->put($filenametostore, fopen($request->file('profile_image'), 'r+'), 'public');
//Store $filenametostore in the database
}
}
У наведеному вище коді я створюю унікальне ім’я файлу, а потім завантажую його на S3. Користувач повинен зберегти ім’я файлу в базі даних для подальшого використання. Завантажуючи файл на S3, я передав третій параметр як "загальнодоступний". Якщо ви не хочете встановлювати файл як "загальнодоступний", пропустіть цей параметр.
Користувач може отримати URL-адресу завантаженого файлу, використовуючи код:
$url = Storage::disk('s3')->url('YOUR_FILENAME_HERE');
Для видалення файлу з сегмента S3 використовуйте метод видалення, як показано нижче.
Storage::disk('s3')->delete('YOUR_FILENAME_HERE');
Вся справа в тому, як завантажити файл на S3 за допомогою файлової системи Laravel. Сподіваюся, ви дізналися про систему Laravel для взаємодії з Amazon S3. Будь ласка, поділіться своїми думками та пропозиціями в розділі коментарів нижче.
Пов’язані статті
- Посібник із завантаження та стиснення зображень у Laravel
- Як зробити резервну копію програми Laravel
- Резервне копіювання програми Laravel на Dropbox