এটি কীভাবে ফাইলটি অভ্যন্তরীণভাবে প্রেরণ করে?
ফর্ম্যাটটি বলা হয় multipart/form-data, যেমন বলা হয়েছিল: এনকটাইপ = 'মাল্টিপার্ট / ফর্ম-ডেটা' অর্থ কী?
আমি যাচ্ছি:
- আরও কিছু HTML5 রেফারেন্স যুক্ত করুন
- একটি ফর্ম জমা উদাহরণ সহ তিনি কেন ঠিক তা ব্যাখ্যা করুন
এইচটিএমএল 5 রেফারেন্স
আছে তিন সম্ভাবনার জন্য enctype:
উদাহরণগুলি কীভাবে উত্পন্ন করা যায়
একবার আপনি প্রতিটি পদ্ধতির উদাহরণ দেখতে পেলে এগুলি কীভাবে কাজ করে তা স্পষ্ট হয়ে যায় এবং কখন আপনার প্রতিটি ব্যবহার করা উচিত।
আপনি ব্যবহার করে উদাহরণ তৈরি করতে পারেন:
ন্যূনতম .htmlফাইলে ফর্মটি সংরক্ষণ করুন:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>upload</title>
</head>
<body>
<form action="http://localhost:8000" method="post" enctype="multipart/form-data">
<p><input type="text" name="text1" value="text default">
<p><input type="text" name="text2" value="aωb">
<p><input type="file" name="file1">
<p><input type="file" name="file2">
<p><input type="file" name="file3">
<p><button type="submit">Submit</button>
</form>
</body>
</html>
আমরা ডিফল্ট টেক্সট মান সেট aωb, যার মানে aωbকারণ ωহয় U+03C9, যা বাইট হয় 61 CF 89 62হল UTF-8।
আপলোড করার জন্য ফাইলগুলি তৈরি করুন:
echo 'Content of a.txt.' > a.txt
echo '<!DOCTYPE html><title>Content of a.html.</title>' > a.html
# Binary file containing 4 bytes: 'a', 1, 2 and 'b'.
printf 'a\xCF\x89b' > binary
আমাদের ছোট ইকো সার্ভারটি চালান:
while true; do printf '' | nc -l 8000 localhost; done
আপনার ব্রাউজারে এইচটিএমএল খুলুন, ফাইলগুলি নির্বাচন করুন এবং জমাতে ক্লিক করুন এবং টার্মিনালটি পরীক্ষা করুন।
nc প্রাপ্ত অনুরোধটি মুদ্রণ করে।
পরীক্ষিত: উবুন্টু 14.04.3, ncবিএসডি 1.105, ফায়ারফক্স 40।
একাধিক / ফর্ম-ডেটা
ফায়ারফক্স পাঠানো হয়েছে:
POST / HTTP/1.1
[[ Less interesting headers ... ]]
Content-Type: multipart/form-data; boundary=---------------------------735323031399963166993862150
Content-Length: 834
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="text1"
text default
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="text2"
aωb
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="file1"; filename="a.txt"
Content-Type: text/plain
Content of a.txt.
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="file2"; filename="a.html"
Content-Type: text/html
<!DOCTYPE html><title>Content of a.html.</title>
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="file3"; filename="binary"
Content-Type: application/octet-stream
aωb
-----------------------------735323031399963166993862150--
বাইনারি ফাইল এবং পাঠ্য ক্ষেত্রের জন্য, বাইটগুলি 61 CF 89 62( aωbইউটিএফ -8 এ) আক্ষরিকভাবে প্রেরণ করা হয়। আপনি এটি যাচাই করতে পারেন nc -l localhost 8000 | hd, যা বলে যে বাইটগুলি:
61 CF 89 62
প্রেরণ করা হয়েছিল ( 61== 'এ' এবং 62== 'বি')।
সুতরাং এটি পরিষ্কার যে:
Content-Type: multipart/form-data; boundary=---------------------------735323031399963166993862150সামগ্রীতে প্রকার সেট করে multipart/form-dataএবং বলে যে ক্ষেত্রগুলি প্রদত্ত দ্বারা পৃথক করা হয়েছেboundary স্ট্রিং ।
তবে লক্ষ করুন যে:
boundary=---------------------------735323031399963166993862150
--আসল বাধার চেয়ে দুটি কম ড্যাডেস রয়েছে
-----------------------------735323031399963166993862150
এটি কারণ দুটি স্ট্যাশ দিয়ে শুরু করার জন্য স্ট্যান্ডার্ডটির সীমা প্রয়োজন --। অন্যান্য ড্যাশগুলি ফায়ারফক্স স্বেচ্ছাসেবী সীমানা বাস্তবায়নের জন্য কীভাবে বেছে নিয়েছিল তা প্রদর্শিত হবে। আরএফসি 7578 স্পষ্টভাবে উল্লেখ করেছে যে এই দুটি শীর্ষস্থানীয় ড্যাশগুলি --প্রয়োজনীয়:
4.1। গুণমান / ফর্ম-ডেটার "সীমানা" পরামিতি
অন্যান্য বহুগুণিত প্রকারের মতো, অংশগুলি সীমানা ডিলিমিটারের সাথে সীমানাযুক্ত, সিআরএলএফ, "-" ব্যবহার করে নির্মিত হয় এবং "সীমানা" প্যারামিটারের মান হয়।
প্রতিটি ক্ষেত্র তার ডেটার আগে কিছু উপ-শিরোনাম পায়: Content-Disposition: form-data;ক্ষেত্র name, এর filename, ডেটা অনুসরণ করে।
সার্ভারটি পরবর্তী সীমানা স্ট্রিং পর্যন্ত ডেটা পড়ে। ব্রাউজারকে অবশ্যই এমন একটি সীমানা বেছে নিতে হবে যা কোনও ক্ষেত্রেই উপস্থিত হবে না, তাই অনুরোধের মধ্যে সীমানা আলাদা হতে পারে।
কারণ আমাদের অনন্য সীমানা, তথ্যের কোনও এনকোডিং প্রয়োজন নেই: বাইনারি ডেটা যেমন পাঠানো হয় তেমন।
টোডো: অনুকূল সীমানা আকার ( log(N)আমি বাজি রেখেছি), এবং এটি খুঁজে পাওয়া অ্যালগরিদমের নাম / চলমান সময়টি কী? জিজ্ঞাসা করা হয়েছে: /cs/39687/find-the-shortest-sequence-that-is-not-a-sub-sequence-of-a-set-of-sequence
Content-Type ব্রাউজার দ্বারা স্বয়ংক্রিয়ভাবে নির্ধারিত হয়।
এটি ঠিক কীভাবে নির্ধারণ করা হয় তাতে জিজ্ঞাসা করা হয়েছিল: ব্রাউজার দ্বারা নির্ধারিত কোনও আপলোড করা ফাইলের মাইম কীভাবে হয়?
আবেদন / এক্স-WWW-ফর্ম-urlencoded
এখন পরিবর্তন enctypeকরতে application/x-www-form-urlencoded, ব্রাউজার, এবং পুনরায় জমা পুনরায় লোড করুন।
ফায়ারফক্স পাঠানো হয়েছে:
POST / HTTP/1.1
[[ Less interesting headers ... ]]
Content-Type: application/x-www-form-urlencoded
Content-Length: 51
text1=text+default&text2=a%CF%89b&file1=a.txt&file2=a.html&file3=binary
স্পষ্টতই ফাইল ডেটা প্রেরণ করা হয়নি, কেবলমাত্র বেসনামগুলি। সুতরাং এটি ফাইলগুলির জন্য ব্যবহার করা যাবে না।
টেক্সট ক্ষেত্রের জন্য, আমরা মতো স্বাভাবিক মুদ্রণযোগ্য অক্ষর দেখতে aএবং bএক বাইট বার্তা পাঠানো হয়েছে, যখন মত মুদ্রণযোগ্য নয় এমন বেশী 0xCFএবং 0x89গ্রহণ 3 বাইট প্রতিটি: %CF%89!
তুলনা
ফাইল আপলোডগুলিতে প্রায়শই প্রিন্টযোগ্য অক্ষরগুলি থাকে (যেমন চিত্রগুলি), তবে পাঠ্য ফর্মগুলি প্রায়শই হয় না।
যে উদাহরণগুলি আমরা দেখেছি তা থেকে:
multipart/form-data: বার্তায় সীমানা ওভারহেডের কয়েকটি বাইট যুক্ত করে এবং এটি গণনায় কিছুটা সময় ব্যয় করতে হবে তবে প্রতিটি বাইটকে একটি বাইটে প্রেরণ করে।
application/x-www-form-urlencoded: ক্ষেত্রের ( &) প্রতি একক বাইট সীমানা রয়েছে তবে প্রতিটি অপ্রিন্টযোগ্য অক্ষরের জন্য 3x এর লিনিয়ার ওভারহেড ফ্যাক্টর যুক্ত করে।
অতএব, এমনকি যদি আমরা ফাইলগুলি প্রেরণ করতে পারি application/x-www-form-urlencoded , আমরা চাই না, কারণ এটি এতটা অক্ষম।
তবে পাঠ্য ক্ষেত্রগুলিতে মুদ্রণযোগ্য অক্ষরগুলির জন্য, এটি কোনও বিষয় নয় এবং কম ওভারহেড উত্পন্ন করে, তাই আমরা কেবল এটি ব্যবহার করি।