Skip to content

PHP'de Base64 Image Upload: Modern Web'in Görüntü Yükleme Yöntemi

Published: at 10:00 AMSuggest an edit

Selam arkadaşlar! Bugün modern web uygulamalarında sıkça karşılaştığımız bir konuyu konuşacağız: Base64 encoded image upload. Özellikle canvas manipulation, image cropping tool’ları veya mobile app’lerden gelen görüntüleri handle ederken bu yöntemi kullanıyoruz. Gelin detaylıca inceleyelim!

Base64 Image Upload Nedir?

Klasik file upload’da, browser bir form aracılığıyla binary dosyayı server’a gönderir. Base64 upload’da ise görüntü string olarak encode edilip gönderiliyor. Yani binary data, text’e dönüştürülüyor!

Mesela Canvas API kullanarak çizim yaptınız veya webcam’den fotoğraf çektiniz. Bu görüntüyü nasıl server’a göndereceksiniz? İşte Base64 encoding devreye giriyor. JavaScript’te canvas.toDataURL() ile görüntüyü Base64 string’e çevirip, AJAX ile gönderiyorsunuz.

Neden Base64 Upload?

Canvas ve Image Manipulation: Crop tool’ları, filter uygulamaları, drawing app’ler… Bunlar canvas üzerinde çalışır ve sonucu Base64 olarak üretir.

Single Request: Görüntüyü JSON payload içinde gönderebilirsiniz. Metadata ile birlikte tek request’te her şey gider.

Cross-Domain: CORS problemlerini bypass edebilirsiniz (dikkatli kullanın!).

Mobile Apps: React Native, Flutter gibi framework’ler genelde Base64 kullanır.

Clipboard API: Copy-paste ile gelen görüntüler Base64 formatında gelir.

Base64 Formatı Nasıl Görünür?

Base64 encoded image şöyle başlar:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA...

Üç parçadan oluşur:

Avantajlar ve Dezavantajlar

Avantajlar:

Dezavantajlar:

PHP’de Base64 Image İşleme

İşlem adımları şöyle:

  1. Data URI’yi parse et: Prefix’i ayır, sadece encoded data’yı al
  2. Decode et: Base64 string’i binary’ye çevir
  3. Validate et: Gerçekten image mı? Güvenlik kontrolü şart!
  4. İşle: Resize, optimize, watermark ekle…
  5. Kaydet: File system’e veya cloud storage’a

Basit Örnekler

Base64 image’ı decode edip kaydetme:

<?php
// Receive Base64 string from POST
$base64_string = $_POST['image'];

// Remove data URI prefix
$base64_string = preg_replace('/^data:image\/\w+;base64,/', '', $base64_string);

// Decode to binary
$image_data = base64_decode($base64_string);

// Generate unique filename
$filename = uniqid() . '.png';
$filepath = 'uploads/' . $filename;

// Save to file
file_put_contents($filepath, $image_data);

echo json_encode(['success' => true, 'filename' => $filename]);
?>

Güvenlik kontrolleri ile:

<?php
function saveBase64Image($base64_string, $output_path) {
    // Extract mime type and data
    if (preg_match('/^data:image\/(\w+);base64,/', $base64_string, $type)) {
        $base64_string = substr($base64_string, strpos($base64_string, ',') + 1);
        $type = strtolower($type[1]); // jpg, png, gif

        // Only allow certain types
        if (!in_array($type, ['jpg', 'jpeg', 'png', 'gif'])) {
            return false;
        }

        // Decode
        $decoded = base64_decode($base64_string);

        // Verify it's actually an image
        $image = imagecreatefromstring($decoded);
        if (!$image) {
            return false;
        }

        // Check file size (e.g., max 5MB)
        if (strlen($decoded) > 5 * 1024 * 1024) {
            return false;
        }

        // Save with proper extension
        $filename = $output_path . '.' . $type;
        file_put_contents($filename, $decoded);

        // Free memory
        imagedestroy($image);

        return $filename;
    }

    return false;
}
?>

Güvenlik Kritik!

Base64 upload’da dikkat edilmesi gerekenler:

File Type Validation: Sadece extension’a güvenmeyin! Magic bytes kontrolü yapın veya getimagesize() kullanın.

Size Limitleri: Base64 normal upload’dan büyük. PHP memory_limit’i aşabilir!

Malicious Code: SVG içine JavaScript embed edilebilir. SVG’leri dikkatli handle edin!

DoS Attacks: Çok büyük Base64 string’ler server’ı yavaşlatabilir.

XSS Prevention: Base64 data’yı direkt HTML’e basmayın!

Performance Optimizasyonları

Chunked Upload: Büyük görüntüleri parçalara bölüp gönderin.

Client-Side Compression: Canvas’ta kaliteyi düşürüp boyutu azaltın:

canvas.toDataURL("image/jpeg", 0.8); // 80% quality

Background Processing: Image processing’i queue’ya atın (Redis, RabbitMQ).

CDN Upload: İşlenmiş görüntüyü CDN’e yükleyin, local’de tutmayın.

Real-World Senaryolar

Avatar Upload: Kullanıcı kare crop yapıyor, Base64 olarak gönderiyor.

Signature Pad: E-imza uygulamaları canvas’a çizilen imzayı Base64 olarak kaydeder.

Screenshot Tool: Browser extension’lar ekran görüntüsünü Base64 olarak gönderir.

Image Editor: Photopea, Canva gibi tool’lar edited image’ı Base64 olarak export eder.

QR Code Generator: Generated QR code’lar genelde Base64 formatında.

Modern Alternatifler

Blob Upload: File API kullanarak blob olarak gönderme. Daha efficient.

FormData API: Multipart upload ama AJAX ile. Best of both worlds.

Direct Upload: S3, Cloudinary gibi servislere direkt upload. Server’ı bypass eder.

WebP Format: Daha küçük boyut, daha iyi kalite. Modern browser’lar destekliyor.

JavaScript Tarafı

// Convert file to Base64
function fileToBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result);
    reader.onerror = error => reject(error);
  });
}

// Send to server
async function uploadImage(file) {
  const base64 = await fileToBase64(file);

  const response = await fetch("/upload.php", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      image: base64,
      filename: file.name,
    }),
  });

  return response.json();
}

Best Practices

  1. Size limitleri koyun: Hem client hem server tarafında
  2. Image optimization: Server’da sharp, ImageMagick ile optimize edin
  3. Async processing: Büyük işlemler için queue kullanın
  4. Error handling: Corrupt data, invalid format için hazırlıklı olun
  5. Monitoring: Memory usage ve processing time’ı takip edin

Ne Zaman Kullanmalı?

Base64 kullanın:

Klasik upload kullanın:

Sonuç

Base64 image upload, modern web development’ın önemli bir parçası. Özellikle SPA’lar, mobile app’ler ve canvas-based uygulamalar için vazgeçilmez. Ama dikkatli kullanılmalı - güvenlik ve performans konularını göz ardı etmeyin!

Benim tavsiyem: Küçük, manipüle edilmiş görüntüler için Base64, büyük ve raw dosyalar için traditional upload. Her tool’un yeri var, önemli olan doğru yerde kullanmak.



Previous Post
Vector Database: AI Çağının Veri Depolama Devrimi
Next Post
Text-to-Speech (TTS): Metni Sese Dönüştürme Sanatı