22 Jun 2018
Laravel Dosya Saklama (File Storage) Kullanımı
  • 1110 Okuma
  • 0 Yorum
  • 5 Beğeni

Laravel Dosya Saklama (File Storage) Kullanımı

Web uygulamalarında kullanıcı tarafından dosya yüklenmesi özelliği birçok noktada kullanılmaktadır. Kullanıcı profil resmi yükleme, mesaj gönderirirken dosya eki alınması vb. durumları buna örnek olarak verilebilir. Bu makalemde Laravel ile bu işlemleri nasıl yapabileceğinizi anlatmaya çalışacağımm.


Laravel dosya işlemleri için Filesystem paketini kullanmaktadır. Bu paket sayesinde, normalde PHP ile birçok kod yazmamız gereken işlemleri kolayca yapabiliriz. Bu paket sayesinde dosyalarımızı bilgisayar üzerinde, Amazon S3 üzerinde ya da Rackspace Cloud Storage üzerinde kolayca saklayabiliriz ve istediğimiz zaman kullanılan saklama alınını kolayca değiştirebiliriz.


Yapılandırma

Yapılandırma işlemleri için "config/filesystems.php" dosyası kullanılmaktadır. Burada varsayılan olarak depolama alanı disk'tir. Ayrıca, Amazon S3 vb. depolama alanları için örnek yapılandırma ayarları bulunmaktadır. Bu dosya üzerinden kullanmak istediğiniz disk'i kolayca yapılandırabilir ve kullanabilirsiniz. Birden fazla depolama alanı kullanımı yapılabilmektedir. Örneğin, kullanıcı profil resimlerini Amazon S3 üzerinde saklarken, kullanıcı mesajları eklerini sunucu üzerindeki diskte saklayabilirsiniz.


Public Disk

Public disk, dosyalarınızın doğrudan kullanıcılar tarafından ulaşabilmesi için kullanılan alandır. Bu dosyalar, "storage/app/public"  altında bulunmaktadır. Bu dosyalara doğrudan erişim için, öncelikle kısayol oluşturulmalıdır. Bunun için aşağıdaki komutu kullanmanız yeterlidir.


php artisan storage:link


Local Driver

Yapılandırma konusunda varsayılan olarak yerel disk kullanıldığından bahsetmiştik. Yerel disk kullanımınında dosyaların kaydedilmesi için "storage/app" klasörü kullanılmaktadır. dosya.txt dosyasının "storage/app" klasörünün altına kaydetme örneği,


Storage::disk('local')->put('dosya.txt', 'Contents');


Gereksinimler

Laravel ile dosyaları saklamak için Amazon S3 ve Rackspace Cloud Storage gibi alanların kullanılabildiğinden bahsetmiştik. Bu gibi depolama alanlarının kullanımı için ekstra paketleri kullanmamız gerekebilir. Bu gibi harici alanların kullanımında gereken paketler ve yapılandır örnekleri, 


    - Rackspace: league/flysystem-rackspace ~1.0
    - Amazon S3: league/flysystem-aws-s3-v3 ~1.0
    - SFTP: league/flysystem-sftp ~1.0



FTP Yapılandırması

'ftp' => [
    'driver'   => 'ftp',
    'host'     => 'ftp.example.com',
    'username' => 'your-username',
    'password' => 'your-password',

    // Optional FTP Settings...
    // 'port'     => 21,
    // 'root'     => '',
    // 'passive'  => true,
    // 'ssl'      => true,
    // 'timeout'  => 30,
],


SFTP Yapılandırması

'sftp' => [
    'driver' => 'sftp',
    'host' => 'example.com',
    'username' => 'your-username',
    'password' => 'your-password',

    // Settings for SSH key based authentication...
    // 'privateKey' => '/path/to/privateKey',
    // 'password' => 'encryption-password',

    // Optional SFTP Settings...
    // 'port' => 22,
    // 'root' => '',
    // 'timeout' => 30,
],


Rackspace Yapılandırması,

'rackspace' => [
    'driver'    => 'rackspace',
    'username'  => 'your-username',
    'key'       => 'your-key',
    'container' => 'your-container',
    'endpoint'  => 'https://identity.api.rackspacecloud.com/v2.0/',
    'region'    => 'IAD',
    'url_type'  => 'publicURL',
],


Cache Yapılandırması

Dosyalarınızı saklarken bir süre için cache'te tutmak isteyebilirsiniz. Bunun için yapılandırmada ayrıca cache için yapılandırma yapmanız gerekmektedir. Cache yapılandırma örneği,


's3' => [
    'driver' => 's3',

    // Other Disk Options...

    'cache' => [
        'store' => 'memcached',
        'expire' => 600,
        'prefix' => 'cache-prefix',
    ],
],


Kullanılacak Diski Belirleme

Makelemizde birden fazla saklama alanının kullanılabileceğinden bahsetmiştik. Eğer bir disk belirtilmezse, Laravel dosyaları varsayılan olarak seçilen alana dosyayı kaydetmektedir. Örneğin varsayılan olarak yerel disk seçilmesi durumunda,


use Illuminate\Support\Facades\Storage;

Storage::put('avatars/1', $fileContents);


kodu "$fileContents" ile belirtilen içeriği "storage/app/avatars" klasörünün altında "1" dosya adı ile kaydetmektedir. Fakat bu verinin "Amazon S3" üzerine kaydedilmesini istiyorsak kodu aşağıdaki şekilde değiştirmemiz gerekiyor,


Storage::disk('s3')->put('avatars/1', $fileContents);

Burada görüldüğü gibi "disk" ile dosyanın kaydedileceği alanı belirtiyoruz. Bu alan belirtilmediği sürece varsayılan olarak belirtilen alan kullanılmaktadır.


Dosya İşlemleri

Bu başlık altında, dosya alma, indirme vb işlemleri örnek kod kullanımlarını vereceğim.


Dosya içeriğini almak

$contents = Storage::get('file.jpg');


Dosya indirmek

return Storage::download('file.jpg');


return Storage::download('file.jpg', $name, $headers);


Dosyaya erişimde kullanılacak linki almak

use Illuminate\Support\Facades\Storage;

$url = Storage::url('file.jpg');


Geçici link üretmek

$url = Storage::temporaryUrl(
    'file.jpg', now()->addMinutes(5)
);


Dosyayı saklamak

use Illuminate\Support\Facades\Storage;

Storage::put('file.jpg', $contents);
// Automatically generate a unique ID for file name...
Storage::putFile('photos', new File('/path/to/photo'));
// Manually specify a file name...
Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');
Storage::putFile('photos', new File('/path/to/photo'), 'public');


Dosya kopyalama ve taşıma

Storage::copy('old/file.jpg', 'new/file.jpg');

Storage::move('old/file.jpg', 'new/file.jpg');


Dosya Yükleme (Upload) ve Kaydetme

Laravel ile kullanıcı tarafından yüklenen dosyayı kaydetmek için birden fazla yöntem bulunmaktadır. "Request" ile gelen dosyayı "store" fonskiyonu ile kaydebileceğiniz gibi "Storage" kullanarak da kaydedebilirsiniz. Bunların kullanım örnekleri,


 public function update(Request $request)
    {
        $path = $request->file('avatar')->store('avatars');

        return $path;
    }


$path = Storage::putFile('avatars', $request->file('avatar'));


Dosya adı belirtme,

$path = $request->file('avatar')->storeAs(
    'avatars', $request->user()->id
);


$path = Storage::putFileAs(
    'avatars', $request->file('avatar'), $request->user()->id
);

Disk belirtme,

$path = $request->file('avatar')->store(
    'avatars/'.$request->user()->id, 's3'
);


Dosya Silme İşlemi

Storage::delete('file.jpg');

Storage::delete(['file.jpg', 'file2.jpg']);


Dizin İşlemleri

Dizinde bulunan dosyalara erişim,

$files = Storage::files($directory);

Dizinde ve alt dizinlerinde bulunan dosyalara erişim,

$files = Storage::allFiles($directory);

Dizin isimlerine erişim,

$directories = Storage::directories($directory);

Dizin isimlerine alt dizinlerle beraber erişim,

$directories = Storage::allDirectories($directory);

Dizin oluşturma,

Storage::makeDirectory($directory);

Dizin silme,

Storage::deleteDirectory($directory);


Sonuç

Dosya yükleme işlemleri ve bu dosyalara erişim birçok web projesinde kullanılmaktadır. Laravel'in dosya yükleme, saklama ve bu dosyalara erişim için sunduğu çözümü bu makalemde anlatmaya çalıştım.


Karşılaştığınız sorunları bana mesaj yoluyla sorabilirsiniz.
Umarım faydalı olur. İyi çalışmalar.


Makaleyi faydalı buldunuz mu ?

Yazar


Legend Engineer

Legend Engineer

Mühendis (Bilgisayar)

Bilgisayar Mühendisliği mezunuyum. Bilgisayar alanında edindiğim bilgileri bu blog üzerinde paylaşıyorum. Beni takipte kalın.

Yorumlar


İlk yorum yapan sen ol

İlginizi Çekebilir

Makale Hakkındaki Düşünçelerinizi Paylaşın