Bir Laravel projesinde, müşteri portali, içerik yönetim sistemi veya e-ticaret platformu olsun, her zaman bir ihtiyaç ortaya çıkar: görüntü yükleme işlevselliği. Kullanıcı avatarları, ürün fotoğrafları, blog küçük resimleri ve belge ekleri, güvenilir bir görüntü yükleme sistemine dayanır. Bu gereksinim sürekli karşımıza çıkar, ancak her seferinde belgelere başvurduğumda, kendimi yarım düzine kaynaktan parça parça bilgi toplarken buluyorum.
Çoğu eğitim, yolun düzgün geçtiği tarafını kapsar. store() yöntemini gösterir, enctype="multipart/form-data"‘dan bahseder ve tamam der. Peki, karmaşık kısımlara ne olacak? Bir kullanıcı 12MB’lık bir dosya yüklediğinde sunucunuz takılırsa ne olur? Doğrulama kuralı yerel olarak geçer fakat yapılandırılmamış bir php.ini yüzünden üretim VPS’nizde başarısız olursa? Ve uygulamanız, dosya adları çakışmalarını düzgün bir şekilde yönetiyor mu, yoksa dosyaları sessizce ezip geçiyor mu?
Bu kılavuz, Laravel’de sağlam bir görüntü yükleme işlevselliği inşa etmem gerektiğinde var olmasını istediğim bir eğitimdir. Veritabanı şemamızın nasıl yapılandırılacağından, istemci tarafı önizleme ile forma kadar, eğitici makalelerde atlanan doğrulama uç durumlarına, gerçekten önemli olan güvenlik hususlarına kadar her şeyi ele alacağız.
TL;DR
TL;DR
- Laravel, görüntü yüklemelerini dosya sistemi katmanı aracılığıyla yönetir, temel yüklemeler için ekstra paket gerekmez.
- Veritabanınızda yalnızca dosyaları değil, aynı zamanda meta verileri de saklayın: dosya adı, yol, MIME türü, boyut, boyutlar.
- Her zaman sunucu ve istemci tarafında doğrulama yapın, sunucu tarafı doğrulama tartışılmazdır.
storage:linkkomutu, dosyaları kamusal webden sunmak için hala gereklidir.- Üretim kaygıları, PHP limitleri, disk izinleri, dosya adı çakışmaları, çoğu eğitimin zayıf kaldığı yerlerdir.
- ServerAvatar’ın yerleşik sunucu yönetimi, dağıtım iş akışınızdaki izin ve PHP yapılandırma sorunlarını ortadan kaldırır.
Laravel’in Dosya Depolama İşleyişi
Laravel’in Dosya Depolama İşleyişi
Bir satır kod yazmadan önce, bir dosya yüklemesi Laravel uygulamasına ulaştığında gerçekten ne olduğunu anlamak faydalıdır. Bu model, ileride saatlerce hata ayıklama yapmaktan kurtulmanızı sağlar.
Kullanıcı bir multipart formu gönderdiğinde, Laravel yüklenen dosyayı bir UploadedFile nesnesi içinde sarar. Bu sadece dosya verisi değildir, aynı zamanda orijinal dosya adı, MIME türü, dosya boyutu, disk üzerindeki geçici yol ve daha fazlasını taşıyan meta verileri de içerir.
Laravel’in resmi belgeleri, yüklenen dosyalar, depolama diskleri ve dosya sistemi işlemleri hakkında detaylı bir genel bakış sunmaktadır; eğer gelişmiş depolama özelliklerini keşfetmek isterseniz bakabilirsiniz.
Laravel, bu nesneyi dosya sistemi katmanına teslim eder ve bu katman, dosyanın nereye konulacağına config/filesystems.php yapılandırmanıza göre karar verir. Görüntü yüklemeleri için en ilgili iki disk şunlardır:
- public – Dosyalar
storage/app/public‘de bulunur. Bu dosyalar, yalnızcaphp artisan storage:linkkomutunu çalıştırdıysanız, doğrudan webden erişilebilir. Bu, halka açık olarak sunmak istediğiniz kullanıcı yüklemeleri için standart bir yoldur. - local – Dosyalar
storage/app‘de bulunur. Bu dosyalar, varsayılan olarak web erişimine kapalıdır, bu nedenle erişim kontrolü sağlamak istediğiniz dosyalar için uygundur; düşünün, bir ödeme duvarının arkasındaki belgeler veya imzalı URL aracılığıyla sunulan görüntüler.
Çoğu görüntü yükleme kullanım durumu için, profil fotoğrafları, ürün resimleri, galeri yüklemeleri, public yolu kullanacaksınız ve bu kılavuzda bu yola odaklanacağım.
Veritabanı Tasarımı: Görüntü Meta Verilerini Doğru Şekilde Saklama
Veritabanı Tasarımı: Görüntü Meta Verilerini Doğru Şekilde Saklama
Görduğüm sık bir hata: yüklenen görüntü yolunu kullanıcı veya ürün tablosunda düz bir dize sütunu olarak saklamak ve işin içinden çıkmak. Bu, görüntünün boyutlarını görüntülemeniz, dosya boyutuna göre filtrelemeniz veya hangi yüklemelerin depolama şişmesine neden olduğunu takip etmeniz gerektiğinde çalışır.
Kaygılarınızı bir araya getirin. Ayrı bir görseller tablosu oluşturun ve polimorfik bir ilişki kullanın. Bu şekilde, uygulamanızdaki herhangi bir model, bir kullanıcı, bir ürün, bir blog yazısı gibi görseller taşıyabilir ve ana tablolarınızı gereksiz yere karıştırmamış olursunuz.
Schema::create('images', function (Blueprint $table) {
$table->id();
$table->morphs('imageable'); // imageable_type ve imageable_id ekler
$table->string('filename');
$table->string('path');
$table->string('mime_type');
$table->unsignedInteger('size'); // bayt cinsinden
$table->unsignedSmallInteger('width')->nullable();
$table->unsignedSmallInteger('height')->nullable();
$table->timestamps();
});
Görsel genişliği ve yüksekliğini saklamak, duyarlı görseller yaratmak, en boy oranlarını doğrulamak ve küçük resimler oluşturmak için faydalı olabilir. Bu değerleri, yükleme sırasında PHP’nin getimagesize() işlevini kullanarak kolayca alabilirsiniz.
Karşılık gelen Eloquent modeli basit bir yapıdadır:
class Image extends Model
{
protected $fillable = [
'filename', 'path', 'mime_type', 'size', 'width', 'height'
];
public function imageable()
{
return $this->morphTo();
}
public function url(): string
{
return asset('storage/' . $this->path . "https://dev.to/" . $this->filename);
}
}
Bu uygulama size sadece bir düz dize sütununun sağladığı özellikleri vermez: boyuta göre görselleri sorgulama, boyutlara göre filtreleme, verimli bir şekilde öngörme yükleme ve depolama arka uçlarını değiştirip uygulama kodunuzu dokunmadan güncelleme imkanı sunar.
Tam Makaleyi Oku: https://serveravatar.com/laravel-image-upload
Kaynak: Orijinal Makale




