FreeToGenerate.com

يركّب بايتات الطلب التي يرسلها المتصفح عند رفع ملف بالضبط، ويقرؤها كذلك. ولا يُرفع شيء: كل ذلك يجري في تبويبك.

حقل نصّي

حقل ملف

جرّب اسمًا:

الفاصل بين الأجزاء. لا يجوز أن يظهر داخل أي جزء، ومواصفة MIME تحدّه بسبعين حرفًا.

ما الذي يحدث للأسماء

اسم الحقلكما تُرسَل
user
اسم الملفكما تُرسَل
résumé (final).pdf
هل يمكن استرجاعه؟
نعم: لا ينتج هذه البايتات إلا هذا الاسم
حجم الجسم
280

اسم الملف الخارج عن US-ASCII يُرسَل بايتات UTF-8 خامًا بلا ما يُعلن ذلك، ولهذا يسبق عدُّ البايتات عدَّ الحروف.

كل هذا يجري في متصفحك. ولا يُرفع شيء.

متوفر أيضًا بلغات أخرى: English · Español · Português · Français

مولّد multipart/form-data ومحلّلها

اكتب الطلب الذي سيرسله المتصفح لرفع ملف، أو الصق واحدًا لتعرف ما يستلمه الخادم فعلًا.

ما multipart/form-data؟

‏multipart/form-data هو التنسيق الذي يرسل به المتصفح نموذجًا يحمل ملفًّا. فبدل سلسلة واحدة من أزواج المفتاح والقيمة، يُقطَّع الجسم أجزاءً يفصل بينها فاصل يسمّى الحدّ، ويحمل كل جزء ترويساته الخاصة. وعلى كل جزء أن يعلن Content-Disposition: form-data ومعه معامل name يقول من أي حقول النموذج جاء؛ والجزء الذي يمثّل ملفًّا يضيف معامل filename ونوع محتوى في العادة.

والفاصل هو المعامل الواجب الوحيد في ترويسة Content-Type للطلب، لأن المتلقي بدونه لا سبيل له إلى معرفة أين ينتهي جزء ويبدأ الذي يليه. ويجب أن يكون نصًّا لا يظهر داخل أي جزء، ومواصفة MIME تحدّه بسبعين حرفًا. ولهذا تولّد المتصفحات الحقيقية شيئًا طويلًا يبدو عشوائيًّا بدل شيء مقروء.

وثمة تفصيلان في التنسيق يوقعان الناس لأنهما يبدوان ضجيج تنسيق. فنهايات الأسطر أزواج CRLF لا أسطرًا مفردة، في كل موضع، بما في ذلك السطر الفارغ الذي يفصل ترويسات الجزء عن محتواه. والفاصل الأخير يحمل شرطتين زائدتين في آخره: وذلك ما يقول إن الجسم انتهى لا أنه بُتر في الطريق.

كيف تستعملها

  1. اختر وضعًا. «بناء طلب» يأخذ حقلًا نصيًّا وحقل ملف ويكتب البايتات التي سيرسلها المتصفح لهما. و«قراءة طلب» يأخذ جسمًا لديك أصلًا ويستنتج الأجزاء التي يستخرجها منه الخادم.
  2. في وضع البناء، اكتب اسم الملف الذي يعنيك. وأزرار الأمثلة تغطي اسمًا بسيطًا، وآخر بعلامات تشكيل، وثالثًا لا يمكن استرجاعه، ورابعًا فيه علامتا اقتباس. وانظر إلى السطر أسفلها: فهو يبيّن كيف يُرسَل كل اسم، وهل يمكن نقض ما جرى له.
  3. في وضع القراءة، الصق الجسم والفاصل. ويمكنك لصق ترويسة Content-Type كاملة فيُستخرج الفاصل منها. ويسرد الجدول كل جزء يستلمه الخادم؛ وتنقسم الاستنتاجات إلى أخطاء تكسر شيئًا، وتنبيهات تعني أن الطلب لم يركّبه متصفح، وملحوظات يحسن معرفتها وليست عيوبًا.

ثلاث مواصفات وثلاثة أجوبة عن اسم الملف

اسأل كيف تضع اسم ملف خارج US-ASCII في عملية رفع تجد ثلاثة أجوبة متعارضة، كلها مُلزِمة، وإنما وُجدت هذه الصفحة لأن أولها — وهو ما سيلجأ إليه كل أحد — ممنوع صراحةً.

تحسم RFC 7578 ذلك في ملحوظة: ترميز RFC 5987، وهو الذي يضيف معامل *filename إلى ترويسة Content-Disposition، لا يجوز استعماله هنا. وذلك عكس قاعدة التنزيل تمامًا. ففي استجابة HTTP تُلزم RFC 6266 بـ*filename لكل اسم يعجز US-ASCII عن التعبير عنه، ولهذا الموقع صفحة مستقلة عن إتقان ذلك. الترويسة نفسها، والمعامل نفسه، وأمر معاكس — والفيصل الوحيد هو أتُرسَل في استجابة أم داخل جسم طلب.

ثم يعرض القسم نفسه جوابًا ثانيًا: يجوز ترميز أسماء الملفات بالنسبة المئوية، على نحو ما يُرمَّز به عنوان file:. وفي الفقرة التالية يعترف بالثالث، وهو ما يجري فعلًا: إذ ترسل أنظمة واسعة الانتشار أسماءً ببايتات خارج US-ASCII مباشرةً، وبـUTF-8 عادةً. وهذا الاعتراف جدير بقراءتين، فالمواصفة التي تقرّ بأن الواقع يفعل غير ذلك مواصفةٌ تخبرك بما ستستلمه شفرتك.

وما تفعله المتصفحات هو الثالث. فمعيار HTML يعرّف الخوارزمية التي تتبعها، وهي ترسل الاسم بايتات خامًا بترميز النموذج، بلا معامل يعلن ذلك. فالمتلقي الذي يخطئ التخمين ينتج نصًّا مشوَّهًا، وليس في الطلب ما يصحّح به. والمولّد هنا يفعل ما يفعله المتصفح، والسطر أسفله يبيّن عدّ البايتات سابقًا عدَّ الحروف، وهو ذلك القرار مجسَّدًا.

الهروب لا يمكن نقضه

خوارزمية معيار HTML تهرّب ثلاثة حروف بالضبط في اسم حقل أو اسم ملف: فاصل السطر يصير %0A، وعودة العربة تصير %0D، وعلامتا الاقتباس تصيران %22. ثم يُغلق القائمة صراحةً: على وكيل المستخدم ألّا يجري أي هروب آخر.

وتلك الجملة الأخيرة هي المهمّة، لأنها تعني أن علامة النسبة لا تُمسّ أبدًا. فالملف الذي اسمه حقًّا a%0Ab.txt والملف الذي في اسمه فاصل سطر حقيقي يصلان كلاهما a%0Ab.txt، وليس في الطلب ما يفرّق بينهما. والأمر نفسه في %0D أمام عودة العربة، وفي %22 أمام علامتَي الاقتباس. وقد قيس ذلك أمام تطبيق حقيقي للخوارزمية لا استُنبط: فالأزواج الثلاثة تخرج متطابقة.

فالتحويل إذن أحادي الاتجاه بحكم التصميم، والإصلاح البديهي — أن تهرّب علامة النسبة كذلك — هو عين ما يمنعه المعيار. وكل ما يحفظ ملفًّا مرفوعًا بالاسم الذي أُعطي له يفترض صامتًا أن هذا لا يقع. وهو نادر، وليس مستحيلًا: فعلامة نسبة يتبعها رقمان ست عشريان هي بالضبط الشكل الذي يكتسبه اسم مرّ بترميز عناوين في مرحلة سابقة.

والأداة تبلّغ عنه ولا تصلحه، إذ لا إصلاح يُطبَّق. فحين يشارك اسمٌ بايتاته اسمًا آخر يقول السطر أسفله ذلك، ويقرّر القارئ أيهمّه ذلك فيما يبنيه أم لا.

ما لا تخبرك به هذه الأداة

هذه تقرأ النصّ الذي تلصقه ولا شيء غيره. فالمتصفح لا يستطيع فحص طلبات موقع آخر، ولذلك لا تدري الأداة أهذا الجسم الذي تنظر إليه هو المُرسَل، ولا أترويسة Content-Type التي بجانبه موافقة له، ولا ما صنع به الخادم بعد ذلك.

والمولّد يكتب جسمًا لا طلبًا. وهو يعرض ترويسة Content-Type التي يجب أن تصحبه، لأن الفاصل يسكن فيها ولا معنى للجسم بدونها، أما بقية الطلب — الطريقة والمسار والطول — فأمرها إليك. فالصق الجسم في العميل الذي تختبر به بدل أن تنتظر من هذه أن ترسل شيئًا.

وثمة تبسيط متعمَّد: فمحتوى الجزء الحقيقي بايتات، والمتصفح يضع صورة JPEG في جزء بلا حرج؛ وهذه تعمل في النصّ، فجزء الملف يحمل محتوى نائبًا لا ملفًّا حقيقيًّا. أما كل ما عداه — البنية والترويسات والهروب والفواصل — فهو بالضبط ما ينتجه المتصفح، وذلك موضوع الصفحة؛ لكن لا تقس حجم رفع حقيقي بما تراه هنا.

وأخيرًا، في التنسيق آلية قديمة لا تطبّقها هذه الأداة: Content-Transfer-Encoding، وهي التي كانت تتيح أن يكون الجزء quoted-printable لينجو من ناقل سباعي البتات. وتقول RFC 7578 للمرسلين ألّا يولّدوها على ناقل يحمل بيانات ثنائية، وHTTP يحملها، فالأداة تنبّه إليها إن لصقت واحدة بدل أن تتظاهر بأنها معتادة.

لماذا هي مجانية؟

بناء جسم الطلب وقراءته عملُ نصّ يجري في متصفحك. ولا خادم في الأمر، فلا شيء يُحاسَب عليه ولا حساب يُنشأ.

ولا يُرفع شيء ولا يُحفظ شيء. أعد تحميل الصفحة تجدها قد نسيت ما لصقته.