Jak przesłać plik do S3 za pomocą systemu plików Laravel?
Niedawno opublikowałem artykuł Prześlij pliki do Amazon S3 za pomocą AWS PHP SDK. Jeden z naszych czytelników zapytał, jak wykonać operacje przesyłania plików AWS S3 za pomocą Laravela. Jeśli chodzi o Laravela, musimy podążać inną ścieżką niż PHP. W tym artykule dowiemy się, jak przesłać plik do S3 za pomocą systemu plików Laravel.
Laravel Filesystem zapewnia różne sterowniki do pracy z lokalnym systemem plików, Amazon S3, Rackspace itp. Sterowniki te zapewniają wygodny i łatwy sposób przesyłania plików lokalnie lub w chmurze.
Amazon S3 to popularna usługa do przechowywania obrazów, plików i dokumentów. Po drugie, przechowywanie plików w chmurze pozwoli zaoszczędzić dużo przepustowości dla Twojej witryny. Oszczędza miejsce na hostingu, a wydajność chmury jest skalowalna.
Powiedziawszy to, przyjrzyjmy się, jak przesłać plik do S3 za pomocą systemu plików Laravel.
Uzyskaj poświadczenia bezpieczeństwa AWS
Aby rozpocząć korzystanie z S3, powinieneś mieć konto w Amazon Web Services. Gdy już to zrobisz, upewnij się, że aktywujesz usługę S3.
Po aktywacji usługi S3 zdobądź swoje dane uwierzytelniające, których będziemy potrzebować w dalszej części samouczka.
Konfiguracja sterownika S3 w Laravel
Jak powiedziałem, zamierzam używać systemu plików Laravel. Wymaga skonfigurowania sterownika S3. Udaj się do edytora i otwórz plik config/filesystems.php
. W tym pliku możesz zobaczyć sterownik zdefiniowany dla S3 w ‘dyskach’.
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'),
],
],
];
W powyższym kodzie Laravel używa metody env() do ustawiania wartości. Oznacza to, że musisz zdefiniować te stałe w swoim .env
pliku. Nie musisz definiować stałych AWS_URL i AWS_ENDPOINT, ponieważ nie jest to wymagane do przesyłania plików do zasobnika S3.
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
AWS_BUCKET=
Dodaj wartość do każdej stałej powyżej. Następnie otwórz terminal w katalogu głównym projektu i uruchom polecenie:
composer require league/flysystem-aws-s3-v3 ~1.0
To polecenie zainstaluje wymaganą bibliotekę, która wywołuje API AWS i wykonuje operacje w chmurze.
Prześlij plik do S3 w Laravel
Wszyscy ustawiamy się z podstawową konfiguracją. Teraz możemy przejść do właściwej części przesyłania plików. Stwórzmy prosty formularz z wejściem pliku i przyciskiem prześlij.
Dodaj poniższy kod do pliku ostrza.
<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>
Zastąp symbol zastępczy ROUTE_URL rzeczywistą trasą.
Laravel daje Storage
fasadę, która służyła do interakcji ze skonfigurowanymi dyskami. W naszym przypadku dysk to S3. Dodaj Storage
fasadę w kontrolerze w następujący sposób:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesStorage;
...
...
Po dodaniu fasady możesz przesyłać pliki na S3. Napisz poniższy kod w swojej metodzie, która wysyła plik na 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
}
}
W powyższym kodzie generuję unikalną nazwę pliku, a następnie przesyłam go do S3. Użytkownik powinien przechowywać nazwę pliku w bazie danych do późniejszego wykorzystania. Podczas wgrywania pliku do S3 przekazałem trzeci parametr jako ‘public’. Jeśli nie chcesz ustawiać pliku jako ‘public’, pomiń ten parametr.
Użytkownik może uzyskać adres URL przesłanego pliku za pomocą kodu:
$url = Storage::disk('s3')->url('YOUR_FILENAME_HERE');
Aby usunąć plik z zasobnika S3, użyj metody usuwania, jak pokazano poniżej.
Storage::disk('s3')->delete('YOUR_FILENAME_HERE');
Chodzi o to, jak przesłać plik do S3 za pomocą systemu plików Laravel. Mam nadzieję, że dowiedziałeś się o systemie dostarczonym przez Laravel do interakcji z Amazon S3. Podziel się swoimi przemyśleniami i sugestiami w sekcji komentarzy poniżej.
Powiązane artykuły
- Przewodnik po przesyłaniu i kompresowaniu obrazów w Laravel
- Jak wykonać kopię zapasową aplikacji Laravel
- Kopia zapasowa aplikacji Laravel na Dropbox