Büyük dosya yükleme akışını nasıl tasarlarsınız? Presigned URL nedir?

Cevap

Dosyayı uygulama sunucusunun üzerinden geçirmek bant genişliği, bellek ve zaman aşımı sorunları yaratır. Yaygın çözüm, istemcinin dosyayı doğrudan nesne depolamaya (S3, GCS) yüklemesidir.

Presigned URL, backend'in kısa süreli ve belirli bir işlem (ör. tek bir anahtara PUT) için imzaladığı URL'dir. İstemci depolama kimlik bilgilerine sahip olmadan yükleme yapabilir.

Akış

  1. İstemci backend'e dosya adı, boyut ve tür bildirir: POST /api/uploads.
  2. Backend yetki, boyut ve MIME türünü kontrol eder, rastgele bir anahtar üretir (uploads/u42/uuid.pdf), veritabanına pending kayıt açar ve presigned URL döner.
  3. İstemci dosyayı bu URL'ye doğrudan PUT eder; ilerleme çubuğu gösterilebilir.
  4. Yükleme bitince istemci backend'e haber verir veya depolama servisi bir olay (S3 event) tetikler.
  5. Backend dosyayı doğrular (gerçek boyut, tür, virüs taraması), küçük resim gibi işlemleri kuyruğa atar ve kaydı ready yapar.
import { PutObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";

const key = `uploads/${user.id}/${crypto.randomUUID()}`;
const url = await getSignedUrl(
  s3,
  new PutObjectCommand({ Bucket: "app-files", Key: key, ContentType: type }),
  { expiresIn: 300 }
);

Dikkat edilecekler

  • Çok büyük dosyalarda multipart upload: parçalar paralel yüklenir, kopan parça yeniden denenir.
  • Kullanıcının verdiği dosya adı anahtar olarak kullanılmaz (path traversal, çakışma).
  • Bucket private olmalı; indirme de kısa ömürlü presigned GET URL veya CDN imzalı URL ile yapılmalı.
  • Tamamlanmayan pending kayıtlar ve yetim dosyalar için temizlik işi (lifecycle kuralı).
  1. SSR, SSG ve CSR arasındaki farklar nelerdir?OrtaWeb MimarisiFull Stack
  2. Monorepo nedir? Avantajları, dezavantajları ve araçları nelerdir?ZorWeb MimarisiFull Stack
  3. MVC mimarisi nedir? Modern web uygulamalarında nasıl karşılık bulur?KolayWeb MimarisiFull Stack
  4. Bir kullanıcı girişinin uçtan uca akışını (frontend'den veritabanına) anlatın.OrtaWeb MimarisiFull Stack
  5. Backend for Frontend (BFF) deseni nedir, ne zaman kullanılır?OrtaWeb MimarisiFull Stack
  6. WebSocket, Server-Sent Events (SSE) ve polling arasındaki farklar nelerdir?OrtaWeb MimarisiFull Stack

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle