Как загрузить файл на 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