Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce sisteminizde PHP 8.2 veya üzeri bir sürümün, Composer paket yöneticisinin ve Laravel 11 yüklü bir projenin hazır olması gerekmektedir. Ayrıca, görüntü işleme işlemleri için Intervention Image kütüphanesini projenize dahil etmelisiniz.
Gerekli kütüphaneyi kurmak için terminalinizde aşağıdaki komutu çalıştırın:
composer require intervention/image-laravel
Bu komut, Laravel ile tam uyumlu çalışan Intervention Image sürücüsünü projenize ekler. Kurulum sonrası yapılandırma dosyasını oluşturmak için şu komutu kullanın:
php artisan vendor:publish --provider="Intervention\Image\Laravel\ServiceProvider"
Bu işlem, config/image.php dosyasını oluşturur. Buradan varsayılan sürücü olarak 'gd' veya 'imagick' seçiminizi yapabilirsiniz. Performans için sunucunuzda 'imagick' yüklüyse onu tercih etmeniz önerilir.
Veritabanı ve Model Yapılandırması
Çoklu görsel yükleme sisteminde, her görselin bir "ürün" veya "galeri" ile ilişkili olması gerekir. Bunun için bir Image modeli ve buna bağlı bir veritabanı tablosu oluşturmalıyız. Bu yapı, görsellerin dosya yollarını ve meta verilerini saklamamıza olanak tanır.
php artisan make:model Image -m
Migration dosyanızı şu şekilde güncelleyin:
Schema::create('images', function (Blueprint $table) {
$table->id();
$table->foreignId('product_id')->constrained()->onDelete('cascade');
$table->string('path');
$table->timestamps();
});
Bu yapı, bir ürün silindiğinde ona bağlı tüm görsellerin de veritabanından temizlenmesini sağlar (cascade delete).
Çoklu Görsel Yükleme İçin Form Tasarımı
Kullanıcıların birden fazla dosya seçebilmesi için HTML formunuzda multiple niteliğini kullanmalısınız. Ayrıca formun enctype="multipart/form-data" özelliğine sahip olduğundan emin olun.
@csrf
Yükle
Burada name="images[]" kullanımı, Laravel'in gelen veriyi bir dizi (array) olarak algılamasını sağlar.
Controller Katmanında Görsel İşleme ve Boyutlandırma
Controller içerisinde gelen dosyaları döngüye almalı, her birini yeniden boyutlandırmalı ve depolama alanına kaydetmeliyiz. Aşağıdaki örnek, görselleri 800x600 piksel boyutuna getirerek kaydeder.
use Intervention\Image\Laravel\Facades\Image;
use Illuminate\Support\Facades\Storage;
public function store(Request $request) {
$request->validate(['images.*' => 'image|mimes:jpeg,png,jpg|max:2048']);
foreach ($request->file('images') as $image) {
$filename = time() . '_' . $image->getClientOriginalName();
$img = Image::read($image->getRealPath());
$img->resize(800, 600, function ($constraint) {
$constraint->aspectRatio();
});
$path = 'uploads/' . $filename;
Storage::disk('public')->put($path, $img->encode());
ImageModel::create(['product_id' => 1, 'path' => $path]);
}
}
Bu kodda aspectRatio() kullanımı, görselin oranını koruyarak bozulmadan boyutlandırılmasını sağlar.
Yöntemlerin Karşılaştırılması
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Sunucu Tarafı (Laravel) | Güvenli, ölçeklenebilir | CPU tüketimi yüksek |
| İstemci Tarafı (JS) | Hızlı, düşük sunucu yükü | Güvenlik riskleri barındırır |
| Cloudinary/S3 API | Yüksek performans | Ek maliyet |
Kritik Uyarı: Kullanıcı tarafından yüklenen dosyalar her zaman güvenlik riski taşır. Dosya türü kontrolünü (MIME type) mutlaka yapın ve yüklenen dosyaları doğrudan çalıştırılabilir dizinlerde tutmayın. Üretim ortamında
storage/app/publicdizinini kullanmak ve dosya isimlerini rastgele oluşturmak en iyi pratiklerdir.
Sıkça Sorulan Sorular
Neden Intervention Image kullanmalıyım?
Intervention Image, PHP'nin yerel GD kütüphanesini çok daha kolay bir sözdizimi ile yönetmenizi sağlar. Boyutlandırma, kırpma ve filtreleme gibi işlemleri tek satırda yapmanıza olanak tanır.
Çok büyük görselleri nasıl yönetirim?
Büyük görseller için Laravel'in Job yapısını (Queues) kullanarak görsel işleme sürecini arka planda (asenkron) çalıştırabilirsiniz. Bu, kullanıcının yükleme ekranında beklemesini engeller.
Dosya isimleri neden çakışabilir?
Aynı isimde iki dosya yüklendiğinde veritabanı veya disk üzerinde çakışma yaşanabilir. Bu yüzden dosya adlarına time() veya Str::uuid() eklemek her zaman benzersiz isimler oluşturmanızı sağlar.
Hangi depolama sürücüsünü kullanmalıyım?
Geliştirme aşamasında local sürücüsü yeterlidir. Ancak üretim ortamında AWS S3 veya benzeri bir bulut depolama servisi kullanmak, uygulamanızın ölçeklenebilirliğini artırır.
Boyutlandırma kalitesini nasıl ayarlarım?
encode() metodunu kullanırken kalite parametresi verebilirsiniz. Örneğin: $img->encode('jpg', 80) komutu, görseli %80 kalite ile kaydeder.
Görsel İşleme Süreçlerinde Performans Optimizasyonu
Uygulamanızda çoklu görsel yükleme işlemleri arttıkça, sunucu üzerindeki CPU ve RAM kullanımı doğru orantılı olarak artacaktır. Özellikle kullanıcıların yüksek çözünürlüklü (4K veya daha büyük) görseller yüklediği senaryolarda, bu işlemleri senkron (eş zamanlı) olarak gerçekleştirmek, HTTP isteğinin zaman aşımına uğramasına neden olabilir. Bu durumu yönetmek için Laravel'in kuyruk (queue) sistemini kullanmak en profesyonel yaklaşımdır.
Görsel işleme görevlerini arka plana atmak için şu adımları izleyebilirsiniz:
// Job oluşturma komutu
php artisan make:job ProcessImage
// Job sınıfı içerisinde işleme mantığı
public function handle()
{
$img = Image::make($this->filePath);
$img->resize(800, null, function ($constraint) {
$constraint->aspectRatio();
})->save();
}
Bu yöntemle kullanıcıya görselin yüklendiğine dair anında geri bildirim dönerken, yeniden boyutlandırma işlemi sunucunun boş olduğu bir anda arka planda gerçekleştirilir. Performansı artırmak için ayrıca WebP formatına geçiş yapmanız, dosya boyutlarını %30-50 oranında düşürecektir.
Görsel Yükleme Sistemlerinde Hata Ayıklama (Debugging)
Çoklu yükleme süreçlerinde en sık karşılaşılan hatalar genellikle dosya izinleri, bellek limitleri ve dosya boyutu kısıtlamalarıdır. Uygulamanızın üretim ortamında sorunsuz çalışması için şu hata ayıklama stratejilerini kullanın:
- Bellek Limitleri: Intervention Image, görseli işlemek için belleğe yükler. Eğer
Memory Limit Exceededhatası alıyorsanız,php.inidosyanızdakimemory_limitdeğerini artırın veya görseli işlemeden önceini_set('memory_limit', '256M');komutunu kullanın. - Dosya İzinleri:
storage/app/publicdizininin yazılabilir olduğundan emin olun. Linux sunuculardachmod -R 775 storagekomutu ile gerekli izinleri verebilirsiniz. - Log Kayıtları: Yükleme sırasında oluşan hataları yakalamak için try-catch bloklarını mutlaka kullanın:
try {
$image->save($path);
} catch (\Exception $e) {
Log::error('Görsel işleme hatası: ' . $e->getMessage());
return back()->withErrors(['msg' => 'Görsel işlenirken bir hata oluştu.']);
}
Ayrıca, geliştirme aşamasında php artisan storage:link komutunu çalıştırmayı unutmamak, görsellerin tarayıcı tarafından erişilebilir olmasını sağlayan en kritik adımdır. Eğer görselleriniz 404 hatası veriyorsa, sembolik bağın (symlink) doğru oluşturulup oluşturulmadığını kontrol edin.
Sonuç
Laravel ile çoklu görsel yükleme ve yeniden boyutlandırma sistemi kurmak, doğru kütüphaneler ve yapılandırılmış bir veritabanı ile oldukça verimli bir süreçtir. Bu rehberde, Intervention Image kullanarak görsellerinizi nasıl optimize edeceğinizi ve bunları güvenli bir şekilde nasıl saklayacağınızı öğrendiniz. Bir sonraki adım olarak, yüklenen görsellerin üzerine filigran (watermark) eklemeyi veya görselleri farklı boyutlarda (thumbnail, medium, original) kaydederek performansınızı daha da artırmayı deneyebilirsiniz.
Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Uygulamanızı canlıya almadan önce tüm form girişlerini doğrulamalı (validation) ve sunucu izinlerini (permissions) güvenlik standartlarına göre yapılandırmalısınız.


Yorumlar (0)
Yorum Yaz