زر «تنزيل التقرير» قد يستقبل اسم الملف من ترويسة HTTP، لكن الاسم العربي يمر بترميز ومعلمات لها قواعد توافق. يقترح مشروع تخرج تطوير الويب مختبراً صغيراً يعرض قيمة Content-Disposition ويفك filename* ثم يقارن ما تقترحه الواجهة، مع حالات اسم ASCII احتياطي وترويسة معطوبة. لا ينفذ المختبر تنزيل ملفات من الإنترنت ولا يكتب إلى نظام الملفات؛ يعرض محاكاة لأسماء ثابتة يراجعها الفريق. وهو مناسب لمشاريع تخرج تطوير الويب التي تحتاج اختبار تنزيل التقارير العربية عبر المتصفح.

ما الذي تقوله Content-Disposition؟

تصف الترويسة طريقة تقديم المحتوى، مثل attachment الذي يطلب من المتصفح تقديمه للتنزيل، وقد تحتوي اقتراحاً لاسم افتراضي. يحدد RFC 6266 حقلاً لرسائل HTTP ويفرق بين المعلمات العادية والموسعة. وجود filename لا يجبر كل مستخدم على حفظ الملف بالاسم نفسه؛ المتصفح أو نظام التشغيل قد يطبقان تنظيفاً أو يعرضان نافذة اختيار اسم.

يجب أن يحلل المشروع قيمة الرأس كصيغة لها quoted strings وهروب علامات اقتباس، لا بتقسيمها على كل فاصلة منقوطة من دون مراعاة الاقتباس. جهز parser أو مكتبة مستخدمة فعلياً وسجل إصدارها. اختبر attachment مع اسم، inline مع اسم، غياب المعلمة، ومعلمات مكررة أو ترويسة غير مكتملة. عند الغموض اعرض «تعذر تفسير الاسم» بدلاً من اختراع قيمة تبدو مؤكدة.

لماذا يوجد filename*؟

قد لا تمثل صيغة filename التقليدية الأحرف الدولية على نحو متفق عليه. يعرّف RFC 8187 صيغة قيمة موسعة تتضمن الترميز واللغة اختيارياً ثم بايتات مئوية. المثال يكون من نمط filename*=UTF-8''.... لا تخلط هذه القواعد بتطبيع URL أو معلمات query؛ التشابه في علامة النسبة لا يعني أنها السياق نفسه.

للتوافق قد يرسل الخادم filename احتياطياً بحروف ASCII وfilename* للاسم الدولي، وإذا فهم العميل الاثنين تذكر MDN أن الصيغة الموسعة تفضَّل. راجع مرجع MDN للترويسة وسجل ملاحظة تاريخ المراجعة؛ سلوك بعض المتصفحات وطرائق التعامل مع percent sequences ليست متطابقة. لا تعرض نصاً عربياً فك ترميزه مرتين، ولا تعتبر نجاح parser لديك دليلاً على نافذة التنزيل الفعلية.

مثال يختبر العربية والاحتياط

في fixture محلية، استخدم attachment; filename="report.pdf"; filename*=UTF-8''%D8%AA%D9%82%D8%B1%D9%8A%D8%B1-%D9%85%D8%AE%D8%AA%D8%A8%D8%B1.pdf. يتوقع المحلل اكتشاف اسم ASCII واسم موسع مكافئ لعبارة «تقرير-مختبر.pdf». اعرض البايتات بعد فكها إلى UTF-8 ثم اطبع المحارف، كي يراجع الفريق أين حصل فك الترميز. هذه قيمة توضيحية، وليست اختباراً لاسم عبر متصفح حي.

جرّب ترويسة لا تحتوي filename*، وأخرى فيها percent escape ناقص، وثالثة فيها charset غير مدعوم. ينبغي أن يظل الاسم الاحتياطي متاحاً إن كانت سياسة المحلل تسمح، وأن يوصف الجزء غير المفهوم. لا تحذف كل الأحرف العربية على أنها غير مسموحة؛ اكتف بتنقية الفواصل والمسارات والتحكم بالطول وفق نظام ملفات المختبر. احتفظ بالقيمة الخام ضمن fixture، لكن لا تستخدمها مباشرة في مسار كتابة.

الاسم اقتراح يحتاج تنقية

تؤكد توصيات RFC أن اسم الملف معلومات إرشادية، وينبغي للعميل إزالة مكونات المسار عند الحفظ. افحص شرطة المسار الأمامية والخلفية، النقطة المزدوجة، المحارف غير المرئية، أسماء الأجهزة الخاصة، النقطة النهائية والمسافات، وطول الاسم. لا تحول التحليل إلى «حماية كاملة من الملفات الخطرة»؛ المجلد المقصود وسياسة نظام التشغيل يظلان جزءاً من القرار.

المختبر لا ينزل محتوى تنفيذي ولا يفتح الاسم ببرنامج. أنشئ فقط preview نصياً، واختبر أن الاسم يبقى نصاً مهرباً في DOM. إذا أضفت زر تنزيل لاحقاً، استخدم ملفاً ثابتاً من داخل المشروع ومجلداً مؤقتاً محدداً، لا تكتب بناء على الاسم إلى مجلد المستخدم بلا موافقة. تختلف قواعد الأنظمة في الأحرف المحجوزة والطول، لذلك سجل قواعد Windows أو Linux التي تختبرها.

مصفوفة توافق صغيرة

أنشئ مجموعة حالات تشمل ASCII، عربية، أحرفاً مركبة، quoted string، ترويسة مقسمة، معلمة مكررة، قيمة مشوهة، اسم فارغ، ومقترح يحوي فاصل مسار. معيار القبول أن يحافظ parser على الاسم الدولي الصحيح حين تتوفر صيغة سليمة، ويعود إلى الاسم الاحتياطي عند تعذرها حسب السياسة المكتوبة. اختبر الوحدة منفردة ثم راقب رأساً أرسله خادم محلي لثلاثة متصفحات على الأقل.

وثق إصدار المتصفح ونظام التشغيل والاسم الذي ظهر في نافذة الحفظ؛ لا تدع هذه الملاحظة تخرج من نطاق الاختبار. لا تفترض أن Chrome وSafari وFirefox ستعالج الأسماء بالطريقة ذاتها، ولا تحول فرق نسخة واحدة إلى قاعدة عامة. اختبر وجود download attribute أيضاً إذا استخدمه النموذج، لأن HTML قد يضيف مصدراً آخر للاسم المقترح.

مخرجات وحدود مشروع التخرج

يتكون التسليم من parser، fixtures موثقة، جدول تنظيف قابل للتعديل، وتقرير مقارنة بين التحليل النظري وما ظهر في المتصفح. يرتبط بالمشاريع الجامعية ويمكن ضبطه عبر خدمة مشاريع التخرج وتطوير تطبيقات الويب. لا يرفع ملفات ولا يعد أداة تصدير إنتاجية؛ إضافة رفع الملفات تغير نطاق الأمان والخصوصية ويجب بحثها منفصلة.

يمكن مراجعة مقال استئناف تنزيل HTTP Range لفهم نقل أجزاء الملف، لكنه لا يحدد الاسم الذي يقترحه الخادم. كما أن هذا المشروع لا يختبر محتوى multipart الوارد في طلب رفع؛ يختبر ترويسة استجابة التنزيل. افصل هذه السيناريوهات في التقرير كي لا يخلط القارئ بين filename في جزء form-data وبين filename في رد HTTP.

المصادر

مراجعة المصادر: .

اختبار المثال وحدوده

قيم أسماء الملفات في الأمثلة بيانات اختبار مصطنعة؛ اختلاف المتصفح يوثق بالتجربة على النسخ المذكورة ولا يفترض مسبقاً.

مقالات ذات صلة

الخدمة المرتبطة: تطوير المواقع والتطبيقات والأنظمة المخصصة.

أرسل متطلبات مشروعك