[silindi] Dosyaları bir yerlere yükleriz ama bu her zaman sunucumuzda bir yer olmaz. Bazen başka sunucuya yükleriz bazen de Amazon S3 gibi bulut servisler kullanırız. Sadece birini değil aynı anda iki farklı yere de yükleme yapabiliriz. Örneğin PDF dosyalarını Amazon S3'ye; kullanıcı avatarlarını sunucumuza. Bu durumda bize bunları güzel ve düzenli bir şekilde kontrol edecek bir yapı gerekli. İstediğimizde, istediğimiz dosyayı ilgili yerden rahatlıkla alabilmeli ve yükleyebilmeliyiz. Bunun Laravel'deki karşılığı da işte Storage olmuş oluyor.
Farklı yerlere yükleme derken, burada yer dediğim Laravel Storage terminolojisinde disk olarak geçiyor. Biz diskleri config/filesystems.php dosyası içinde yapıyoruz. Oraya girerseniz öntanımlı gelen ayarları görebilirsiniz. Varsayılan olarak local disk seçili gelmektedir.
Örneğin:
// Bu dosyayı varsayılan diske yükler ve size dosya yolunu verir.
$path = $request->file('avatar');
// Bu dosyayı Amazon S3'ye yükler ve size dosya yolunu verir.
// Burada stora yöntemi ile disk seçiyoruz
$path = $request->file('avatar')->store('s3');
Local diski storage/app klasörünü ifade ediyor. Bildiğiniz gibi public dışındaki bir klasöre dışarıdan, yani mesela tarayıcıdan erişmek direkt mümkün değil. Dışarıdan erişmek için dosya yükleyeceksek, yani klasik dosya yükleme yapacaksak, insanlar bu dosyayı tarayıcıdan erişebilecekse public diskini kullanıyoruz. Bu büyük ihtimalle sizin istediğiniz olduğu için bunu varsayılan disk yapabilirsiniz. Bunun için .env dosyanıza FILESYSTEM_DRIVER=public
eklemelisiniz. Eğer sunucuya .env dosyanızı göndermiyorsanız config/filesystems.php içinde 'default' => env('FILESYSTEM_DRIVER', 'public'),
yapacaksınız. Daha sonra ise aşağıdaki komutu çağırmanız lazım:
php artisan storage:link
Bu komut storage/app/public klasörü için public içerisine storage isimli bir symlink oluşturuyor. Böylece storage/app/public içine yüklenen dosyalara dışarıdan ulaşılabiliyor. Yani public klasörünün içerisine gidip kendiniz upload diye bir klasör açmayacaksınız. Dosyalar daima storage/app/public içine yüklenecek. Eğer uplaod klasörü istiyorsanız bunu storage/app/public/upload şeklinde açmanız lazım. Bu dosyayı da kullanırken asset('storage/1.jpg')
ya da asset('storage/uploads/fatura.pdf')
şeklinde kullanıyorsunuz. Mesela bu fatura.pdf dosyasının yolunu almak için Storage::url() kullanabilirsiniz:
// http://domain.com/storage/uploads/fatura.pdf
asset('storage/uploads/fatura.pdf')
// http://domain.com/storage/uploads/fatura.pdf
$path = Storage::url('uploads/fatura.pdf');
// Eğer dosya S3'de olsaydı:
$path = Storage::disk('s3')->url('uploads/fatura.pdf');
Son olarak kendiniz de disk tanımlayabilirsiniz. Mesela:
'uploads' => [
'driver' => 'local',
'root' => storage_path('app/public/uploads'),
'url' => env('APP_URL').'/storage/uploads',
'visibility' => 'public',
],
Artık $path = $request->file('dosya')->store('uploads');
şeklinde yükleyebilirsiniz.
Geri kalanı, diğer kullanım şekilleri vs zaten dokümanlarda yazıyor:
https://laravel.com/docs/8.x/filesystem
https://laravel.com/docs/8.x/requests#storing-uploaded-files