الهدف
بعد هالدرس تقدر تبني file upload كامل: API route يولّد presigned URL، frontend يرفع مباشرة لـ Cloudflare R2، و Prisma يحفظ الـ metadata.
ليش هذا الحين؟
الإيميل جاهز والتطبيق يتواصل مع المستخدمين — الحين نضيف قدرة رفع الملفات. كثير من التطبيقات تحتاجها: صور profile، مستندات، attachments. الطريقة الغلط إنك ترفع الملف للـ server وبعدين تنقله — تبطّئ كل شي وتكلّف. الطريقة الصح: presigned URL.
الفكرة
ليش R2؟ Cloudflare R2 نفس S3 API بس بدون egress fees — يعني ما تدفع لما المستخدمين يحملون ملفاتهم. لـ startup في البداية، هذا فرق كبير في الفاتورة.
الـ Presigned URL Pattern:
- الـ frontend يطلب من الـ API: "أبي أرفع ملف بهالاسم وهالنوع"
- الـ API يتحقق من الصلاحية والحجم والنوع
- الـ API يولّد presigned URL من R2 (صالحة 60 ثانية)
- الـ frontend يرفع الملف مباشرة لـ R2 بـ PUT request
- الـ API يحفظ الـ metadata (URL، اسم الملف، حجمه) في Prisma
هذا يعني الملف ما يمر من server أبد — أسرع وأرخص.
التحقق المفروض يصير في الـ API، قبل ما تولّد الـ URL:
- الحجم: 10MB كحد أقصى
- النوع: بس الأنواع اللي تقررها
- الصلاحية: المستخدم مسجّل دخول
الـ metadata في Prisma: الـ key في R2 (المسار) هو اللي تحفظه — بس تبني الـ public URL منه بعدين.