Laravel i HostArena S3: podešavanje filesystem diska

Laravel i HostArena S3: podešavanje filesystem diska

Laravel ima ugrađenu podršku za S3 preko Flysystem biblioteke, pa HostArena S3 storage možete koristiti kao glavni ili dodatni disk za fajlove vaše aplikacije: korisničke uploade, slike, izveštaje i slično. Ovo uputstvo pokazuje podešavanje i osnovne primere.

Šta vam je potrebno

PodatakVrednost / primerGde ga nalazite
Endpointhttps://s3.hostarena.rsisti za sve korisnike
Regiongarageisti za sve korisnike, obavezan
Bucketvas-bucketHostArena korisnički panel, kod S3 usluge
Access KeyVAS_ACCESS_KEYHostArena korisnički panel, kod S3 usluge
Secret KeyVAS_SECRET_KEYHostArena korisnički panel, kod S3 usluge

Uz to vam treba Laravel projekat i Composer.

Koraci podešavanja

  1. Instalirajte S3 adapter za Flysystem:
    composer require league/flysystem-aws-s3-v3 "^3.0" --with-all-dependencies
  2. U .env fajl dodajte ili izmenite sledeće vrednosti:
    FILESYSTEM_DISK=s3
    
    AWS_ACCESS_KEY_ID=VAS_ACCESS_KEY
    AWS_SECRET_ACCESS_KEY=VAS_SECRET_KEY
    AWS_DEFAULT_REGION=garage
    AWS_BUCKET=vas-bucket
    AWS_ENDPOINT=https://s3.hostarena.rs
    AWS_USE_PATH_STYLE_ENDPOINT=true
    AWS_URL=https://s3.hostarena.rs/vas-bucket
  3. Proverite da disk s3 u config/filesystems.php čita ove vrednosti. U novijim verzijama Laravela on već izgleda ovako; ako nešto nedostaje, dopunite:
    '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'),
        'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
        'throw' => false,
    ],
  4. Ako ste ranije keširali konfiguraciju, osvežite je:
    php artisan config:clear

Napomene uz vrednosti:

  • AWS_DEFAULT_REGION mora biti garage; sa us-east-1 server odbija zahteve.
  • AWS_ENDPOINT je uvek https://s3.hostarena.rs, bez naziva bucket-a.
  • AWS_USE_PATH_STYLE_ENDPOINT=true je najpouzdanija opcija.
  • AWS_URL se koristi za javne adrese fajlova (Storage::url()); bucket se u adresi navodi samo jednom.
  • Fajl .env nikad ne stavljajte u Git ili javni repozitorijum.

Provera da radi

Pokrenite php artisan tinker i izvršite:

use IlluminateSupportFacadesStorage;

Storage::disk('s3')->put('test.txt', 'HostArena S3 storage');
Storage::disk('s3')->exists('test.txt');   // treba da vrati true
Storage::disk('s3')->get('test.txt');      // vraća sadržaj fajla

Ako put vrati false, privremeno postavite 'throw' => true u konfiguraciji diska da biste videli tačnu grešku.

Primeri korišćenja

Čuvanje fajla koji je poslao korisnik (u kontroleru):

use IlluminateHttpRequest;
use IlluminateSupportFacadesStorage;

public function store(Request $request)
{
    $putanja = Storage::disk('s3')->putFile('uploads', $request->file('file'));

    return $putanja; // npr. uploads/abc123.jpg
}

Javna adresa fajla (radi samo ako je za bucket uključen Website hosting u HostArena panelu):

$url = Storage::disk('s3')->url('uploads/slika.jpg');
// https://s3.hostarena.rs/vas-bucket/uploads/slika.jpg

Privremena adresa za privatan fajl (presigned URL), na primer na 10 minuta:

$url = Storage::disk('s3')->temporaryUrl('uploads/ugovor.pdf', now()->addMinutes(10));

Brisanje fajla:

Storage::disk('s3')->delete('test.txt');

Pažnja: delete trajno briše fajl sa S3. Kod brisanja više fajlova ili celih foldera (deleteDirectory) proverite putanju pre pokretanja.

Najčešći problemi

Greška „AuthorizationHeaderMalformed”

Region nije garage. Ispravite AWS_DEFAULT_REGION i pokrenite php artisan config:clear.

Access Denied ili SignatureDoesNotMatch

Proverite AWS_ACCESS_KEY_ID i AWS_SECRET_ACCESS_KEY, bez razmaka i navodnika viška.

Bucket ne postoji (NoSuchBucket)

Proverite AWS_BUCKET i da u AWS_ENDPOINT niste dopisali naziv bucket-a.

Ne može da se poveže

Proverite da je AWS_ENDPOINT=https://s3.hostarena.rs i da server dozvoljava odlazne veze na port 443.

Adresa iz Storage::url() ne otvara sliku

Uključite Website hosting za bucket ili koristite temporaryUrl(). Proverite i da AWS_URL sadrži bucket samo jednom.

Zaključak

Sa ovim podešavanjem Laravel čuva fajlove na HostArena S3 storage-u. Za rad bez Laravela pogledajte PHP (AWS SDK) i HostArena S3, a za detalje o adresama HostArena S3 API. Nemate S3? Pogledajte pakete. Za pomoć otvorite tiket u korisničkom panelu.

Tags: , , ,