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ış
- İstemci backend'e dosya adı, boyut ve tür bildirir:
POST /api/uploads. - Backend yetki, boyut ve MIME türünü kontrol eder, rastgele bir anahtar üretir (
uploads/u42/uuid.pdf), veritabanınapendingkayıt açar ve presigned URL döner. - İstemci dosyayı bu URL'ye doğrudan
PUTeder; ilerleme çubuğu gösterilebilir. - Yükleme bitince istemci backend'e haber verir veya depolama servisi bir olay (S3 event) tetikler.
- Backend dosyayı doğrular (gerçek boyut, tür, virüs taraması), küçük resim gibi işlemleri kuyruğa atar ve kaydı
readyyapar.
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
pendingkayıtlar ve yetim dosyalar için temizlik işi (lifecycle kuralı).
İlgili Web Mimarisi soruları
- SSR, SSG ve CSR arasındaki farklar nelerdir?
- Monorepo nedir? Avantajları, dezavantajları ve araçları nelerdir?
- MVC mimarisi nedir? Modern web uygulamalarında nasıl karşılık bulur?
- Bir kullanıcı girişinin uçtan uca akışını (frontend'den veritabanına) anlatın.
- Backend for Frontend (BFF) deseni nedir, ne zaman kullanılır?
- WebSocket, Server-Sent Events (SSE) ve polling arasındaki farklar nelerdir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.