رفع الملفات باستخدام Fetch
أرسلوا الملفات إلى خادم باستخدام FormData.
رفع الملفات باستخدام Fetch درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.
رفع الملفات باستخدام fetch
لإرسال الملفات إلى خادم، أرسل طلب POST يحتوي على جسم FormData باستخدام fetch. يتولى المتصفح ترميز multipart/form-data نيابةً عنك، بما في ذلك محتويات الملفات.
إنشاء FormData
اجمع الملف من حقل إدخال وأرفقه، إلى جانب أي حقول أخرى، بكائن FormData.
const file = document.querySelector('#picker').files[0];
const data = new FormData();
data.append('avatar', file);
data.append('userId', '42');
console.log(data.has('avatar'));طلب POST الأساسي
مرّر FormData بوصفه قيمة body لطلب POST باستخدام fetch. والاستجابة هي Promise يمكنك انتظارها باستخدام await.
async function upload(data) {
const response = await fetch('/api/upload', {
method: 'POST',
body: data
});
console.log(response.status);
}لا تضبط Content-Type
من الأخطاء الشائعة ضبط Content-Type يدويًا. اترك المتصفح يضبطه، لأنه يجب أن يتضمن سلسلة boundary الخاصة بـ multipart. ويؤدي ضبطه بنفسك إلى تعطيل التحميل.
const response = await fetch('/api/upload', {
method: 'POST',
body: formData
});
console.log('browser added the boundary automatically');قراءة الاستجابة
تحقق من response.ok وحلّل جسم الاستجابة، وغالبًا ما يكون بتنسيق JSON، بعد نجاح التحميل.
async function upload(data) {
const response = await fetch('/api/upload', { method: 'POST', body: data });
if (!response.ok) {
throw new Error('upload failed: ' + response.status);
}
const result = await response.json();
console.log(result);
}معالجة الأخطاء
غلّف الاستدعاء داخل try/catch. لاحظ أن fetch لا يرفض الطلب إلا عند حدوث أخطاء في الشبكة، لذلك يجب أن تتحقق من response.ok لمعرفة حالات أخطاء HTTP.
async function upload(data) {
try {
const res = await fetch('/api/upload', { method: 'POST', body: data });
if (!res.ok) throw new Error('HTTP ' + res.status);
console.log('uploaded');
} catch (err) {
console.log('error:', err.message);
}
}رفع ملفات متعددة
أرفق عدة ملفات تحت المفتاح نفسه باستخدام append، أو كرّر على قائمة الملفات لإضافتها كلها.
const files = document.querySelector('#picker').files;
const data = new FormData();
for (const file of files) {
data.append('photos', file);
}
console.log(data.getAll('photos').length + ' files queued');إضافة ترويسات مثل Auth
يمكنك إضافة ترويسات مثل Authorization، لكن ليس Content-Type. ويظل الجسم هو FormData.
const response = await fetch('/api/upload', {
method: 'POST',
headers: { Authorization: 'Bearer token123' },
body: formData
});
console.log(response.status);إرسال Blob مُنشأ
يمكنك تحميل بيانات تنشئها في المتصفح، وليس الملفات المحددة فقط. أرفق Blob مع اسم ملف لإرسال مستند مُنشأ.
const blob = new Blob([JSON.stringify({ ok: true })], {
type: 'application/json'
});
const data = new FormData();
data.append('report', blob, 'report.json');
await fetch('/api/upload', { method: 'POST', body: data });
console.log('generated file sent');إلغاء تحميل
استخدم AbortController لإلغاء تحميل بطيء، مثلًا عندما ينتقل المستخدم إلى صفحة أخرى.
const controller = new AbortController();
fetch('/api/upload', {
method: 'POST',
body: formData,
signal: controller.signal
}).catch(e => console.log(e.name));
controller.abort();أهمية ذلك
يُعد الجمع بين FormData وfetch الطريقة الحديثة والقياسية لتحميل الملفات: أرفق الحقول والملفات، وأرسل FormData باستخدام POST، ودع المتصفح يرمّز multipart مع boundary الصحيح. تجنب ضبط Content-Type، وتحقق دائمًا من response.ok، ونظّف الموارد.
async function submitForm(formEl) {
const data = new FormData(formEl);
const res = await fetch('/submit', { method: 'POST', body: data });
console.log('status', res.status);
}اختبار سريع
لماذا يجب ألا تضبط ترويسة Content-Type يدويًا عند إرسال FormData باستخدام fetch عبر POST؟
مراجعة: رفع الملفات باستخدام fetch
لقد تعلمتم إرسال الملفات إلى خادم:
- أرفق الملفات والحقول بكائن FormData، ثم مرّره كقيمة
bodyفي fetch. - لا تضبط
Content-Typeيدويًا أبدًا؛ إذ يضيف المتصفح boundary الخاص بـ multipart. - تحقق من
response.okلأن fetch لا يرفض الطلب إلا عند أخطاء الشبكة. - يمكنك إرسال ملفات متعددة وكائنات Blob مُنشأة، وإلغاء عمليات التحميل باستخدام
AbortController.
الأسئلة الشائعة
هل درس «رفع الملفات باستخدام Fetch» مجاني؟
نعم — نص درس «رفع الملفات باستخدام Fetch» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «رفع الملفات باستخدام Fetch»؟
أرسلوا الملفات إلى خادم باستخدام FormData. تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟
لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «رفع الملفات باستخدام Fetch»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟
نعم. كل درس في JavaScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كائن FormData
- قراءة الملفات باستخدام FileReader
- Blobs وعناوين URL للكائنات
- رفع الملفات باستخدام Fetch