এইচটিটিপি ফাইল আপলোড কীভাবে কাজ করে?


527

আমি যখন ফাইলের সাথে সংযুক্ত একটি সহজ ফর্ম জমা দিই:

<form enctype="multipart/form-data" action="http://localhost:3000/upload?upload_progress_id=12344" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="100000" />
Choose a file to upload: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>

এটি কীভাবে ফাইলটি অভ্যন্তরীণভাবে প্রেরণ করে? ফাইলটি কি এইচটিটিপি বডি এর অংশ হিসাবে ডেটা হিসাবে প্রেরণ করা হয়েছে? এই অনুরোধের শিরোনামে, আমি ফাইলটির নাম সম্পর্কিত কোনও কিছুই দেখতে পাচ্ছি না।

আমি কোনও ফাইল প্রেরণের সময় এইচটিটিপিটির অভ্যন্তরীণ কাজগুলি জানতে চাই।


আমি কিছুক্ষণের মধ্যে একটি স্নিফার ব্যবহার করি নি তবে আপনি যদি আপনার অনুরোধে কী পাঠানো হচ্ছে তা দেখতে চান (যেহেতু এটি সার্ভারের কাছে এটি অনুরোধ) এটি শুকনো। এই প্রশ্নটি খুব বিস্তৃত। নির্দিষ্ট প্রোগ্রামিং প্রশ্নগুলির জন্য এসও বেশি।
পাপারাজ্জো

স্নিফাররা যেতে যেতে, ফিডলার আমার পছন্দের অস্ত্র weapon এমনকি তারা কীভাবে পোস্ট করে তা দেখতে আপনি নিজের পরীক্ষা অনুরোধগুলি তৈরি করতে পারেন।
ফিল कूপার

যারা আগ্রহী জন্য, এছাড়াও "দেখুন MAX_FILE_SIZEপিএইচপি - কি বিন্দু" এ stackoverflow.com/q/1381364/632951
Pacerier

আমি MAX_FILE_SIZE অদ্ভুত বলে মনে করি। যেহেতু আমি পোস্ট করার আগে ক্রোমে আমার এইচটিএমএলকে 100000000 এ পরিবর্তন করতে পারি যাতে এটি আরও ভাল মান পোস্ট করে। হয় ১. লবণের মাধ্যমে সুরক্ষিত হ্যাশ সহ একটি কুকিতে এটি রয়েছে তাই কুকি সংশোধন করা হলে সার্ভার ব্যতিক্রম যাচাই করতে পারে এবং ব্যতিক্রম ছুঁড়ে ফেলতে পারে (ওয়েবপিস বা প্লেফ্রেমওয়ার্ক উভয়ই করতে পারে) বা কিছু ফর্ম যাচাইকরণ যা জিনিসগুলি পরিবর্তিত হয়নি। @ 0xSina
ডিন হিলার

উত্তর:


320

আসুন একবার দেখে নেওয়া যাক আপনি যখন ফাইল নির্বাচন করেন এবং আপনার ফর্মটি জমা দেন (আমি ব্রেভিটির জন্য শিরোনামগুলি কেটে ফেলেছি):

POST /upload?upload_progress_id=12344 HTTP/1.1
Host: localhost:3000
Content-Length: 1325
Origin: http://localhost:3000
... other headers ...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryePkpFF7tjBAqx29L

------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="MAX_FILE_SIZE"

100000
------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="uploadedfile"; filename="hello.o"
Content-Type: application/x-object

... contents of file goes here ...
------WebKitFormBoundaryePkpFF7tjBAqx29L--

দ্রষ্টব্য: প্রতিটি সীমানার স্ট্রিং অবশ্যই অতিরিক্ত দিয়ে উপসর্গ করা উচিত -- শেষ সীমানা স্ট্রিংয়ের শেষের মতো । উপরের উদাহরণটিতে ইতিমধ্যে এটি অন্তর্ভুক্ত রয়েছে তবে এটি মিস করা সহজ হতে পারে। নীচে @ অ্যান্ড্রি দ্বারা মন্তব্য দেখুন।

ফর্মের প্যারামিটারগুলিকে URL এনকোড করার পরিবর্তে, ফর্ম প্যারামিটারগুলি (ফাইল ডেটা সহ) অনুরোধের মূল অংশে একটি মাল্টিপার্ট ডকুমেন্টের বিভাগ হিসাবে পাঠানো হয়।

উপরের উদাহরণে, আপনি MAX_FILE_SIZEফর্মটিতে মান সেট করে ইনপুট পাশাপাশি ফাইলের ডেটাযুক্ত একটি বিভাগ দেখতে পাবেন see ফাইলের নামটি Content-Dispositionশিরোলেখের অংশ ।

সম্পূর্ণ বিবরণ এখানে


7
@ সোর্স.আরআর: না Web ওয়েবসভারগুলি সর্বদা (প্রায়?) থ্রেড থাকে যাতে তারা একযোগে সংযোগগুলি পরিচালনা করতে পারে। মূলত, পোর্ট ৮০ তে শোনার ডিমন প্রক্রিয়া তত্ক্ষণাত অন্য থ্রেড / প্রক্রিয়াতে পরিবেশন করার কাজটি সরিয়ে দেয় যাতে এটি অন্য সংযোগের জন্য শোনার পথে ফিরে যেতে পারে; এমনকি যদি দুটি আগত সংযোগ ঠিক একই মুহুর্তে আসে তবে ডেমোন সেগুলি পড়ার জন্য প্রস্তুত না হওয়া পর্যন্ত তারা কেবল নেটওয়ার্ক বাফারে বসে থাকবে।
উদ্বিগ্ন

10
থ্রেডিংয়ের ব্যাখ্যাটি কিছুটা ভুল কারণ উচ্চ পারফরম্যান্স সার্ভার রয়েছে যা একক থ্রেড হিসাবে ডিজাইন করা হয়েছে এবং সংযোগগুলি থেকে ডেটার প্যাকেটগুলি ডাউনলোড করার জন্য দ্রুত একটি স্টেট মেশিন ব্যবহার করে। পরিবর্তে, টিসিপি / আইপিতে, পোর্ট 80 একটি শ্রবণ পোর্ট হয়, পোর্ট নয় ডেটা স্থানান্তরিত হয়।
slebetman

9
যখন একটি আইপি শ্রবণ সকেট (পোর্ট ৮০) কোনও সংযোগ পায় তখন অন্য বন্দরে অন্য সকেট তৈরি করা হয়, সাধারণত এলোমেলো সংখ্যার উপরে 1000 থাকে। এই সকেটটি রিমোট সকেটের সাথে সংযোগ স্থাপন করে 80 টি নতুন সংযোগ শোনার জন্য বিনামূল্যে ছেড়ে যায়।
slebetman

11
@ স্লেবেটম্যান সবার আগে, এটি এইচটিটিপি সম্পর্কে। এফটিপি সক্রিয় মোড এখানে প্রয়োগ হয় না। দ্বিতীয়ত, শ্রুতি সকেট প্রতিটি সংযোগে অবরুদ্ধ হয় না। আপনার কাছে একটি বন্দরে যতগুলি সংযোগ থাকতে পারে, যেমন অন্য পক্ষের নিজস্ব প্রান্তটি আবদ্ধ করার জন্য বন্দর রয়েছে।
স্লোটোস

33
নোট করুন যে কন্টেন্ট-টাইপ শিরোনাম ক্ষেত্রের অংশ হিসাবে সীমানা স্ট্রিংটি নীচের পৃথক অংশের জন্য সীমানা স্ট্রিংয়ের চেয়ে 2 টি অক্ষর ছোট sh আমার আপলোডারটি কেন কাজ করে না তা বোঝার চেষ্টা করার জন্য আমি কেবল এক ঘন্টা সময় ব্যয় করেছি কারণ এটি লক্ষ্য করা বেশ কঠিন যে প্রথম সীমাবদ্ধ স্ট্রিংয়ে আসলে কেবল 4 টি ড্যাশ রয়েছে তবে অন্যান্য সীমানার স্ট্রিংয়ে 6 টি ড্যাশ রয়েছে। অন্য কথায়: স্বতন্ত্র ফর্ম ডেটা পৃথক করতে সীমানা স্ট্রিং ব্যবহার করার সময়, এটি দুটি ড্যাশ দ্বারা উপস্থাপিত করা উচিত: - এটি অবশ্যই আরএফসি 1867 তে বর্ণিত হয়েছে তবে আমি মনে করি এটি এখানেও নির্দেশ করা উচিত
আন্দ্রেস

279

এটি কীভাবে ফাইলটি অভ্যন্তরীণভাবে প্রেরণ করে?

ফর্ম্যাটটি বলা হয় multipart/form-data, যেমন বলা হয়েছিল: এনকটাইপ = 'মাল্টিপার্ট / ফর্ম-ডেটা' অর্থ কী?

আমি যাচ্ছি:

  • আরও কিছু HTML5 রেফারেন্স যুক্ত করুন
  • একটি ফর্ম জমা উদাহরণ সহ তিনি কেন ঠিক তা ব্যাখ্যা করুন

এইচটিএমএল 5 রেফারেন্স

আছে তিন সম্ভাবনার জন্য enctype:

  • x-www-urlencoded
  • multipart/form-data( আরএফসি 2388 তে নির্দিষ্ট পয়েন্ট )
  • text-plain। এটি "কম্পিউটারের দ্বারা নির্ভরযোগ্যভাবে ব্যাখ্যাযোগ্য নয়", সুতরাং এটি কখনও উত্পাদনে ব্যবহার করা উচিত নয় এবং আমরা এটির দিকে আরও তাকাব না।

উদাহরণগুলি কীভাবে উত্পন্ন করা যায়

একবার আপনি প্রতিটি পদ্ধতির উদাহরণ দেখতে পেলে এগুলি কীভাবে কাজ করে তা স্পষ্ট হয়ে যায় এবং কখন আপনার প্রতিটি ব্যবহার করা উচিত।

আপনি ব্যবহার করে উদাহরণ তৈরি করতে পারেন:

ন্যূনতম .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&#x03C9;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&#x03C9;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 , আমরা চাই না, কারণ এটি এতটা অক্ষম।

তবে পাঠ্য ক্ষেত্রগুলিতে মুদ্রণযোগ্য অক্ষরগুলির জন্য, এটি কোনও বিষয় নয় এবং কম ওভারহেড উত্পন্ন করে, তাই আমরা কেবল এটি ব্যবহার করি।


1
আপনি কীভাবে বাইনারি সংযুক্তি যুক্ত করবেন? (অর্থাত্ একটি ছোট চিত্র) - আমি মান Content-Dispositionএবং Content-Typeবৈশিষ্ট্যের মান পরিবর্তন করতে পারি তবে কীভাবে 'সামগ্রী' পরিচালনা করব?
blurfus

3
@ianbeks ব্রাউজারটি অনুরোধটি প্রেরণের আগে এটি স্বয়ংক্রিয়ভাবে করে। আমি জানি না এটি কোন হিউরিস্টিক্স ব্যবহার করে তবে সম্ভবত ফাইল এক্সটেনশানটি তাদের মধ্যে রয়েছে। এই প্রশ্নের উত্তর দিতে পারেন: stackoverflow.com/questions/1201945/...
সিরো Santilli郝海东冠状病六四事件法轮功

3
@ সিরোস্যান্টিলি 六四 事件 法轮功 纳米比亚 威 视 আমি মনে করি এই উত্তরটি নির্বাচিতটির চেয়ে অনেক ভাল। তবে দয়া করে আপনার প্রোফাইল থেকে অপ্রাসঙ্গিক সামগ্রী সরিয়ে দিন। এটা এসও এর চেতনাবিরোধী।
স্মিভিকিপিডিয়া

2
@ এসএমউইকিপিডিয়া আরএফসি উক্তিটির জন্য এবং এই উত্তরটি পছন্দ করার জন্য ধন্যবাদ! ব্যবহারকারীর নাম সম্পর্কে: আমার কাছে এসও-র স্পিরিটটি হ'ল প্রত্যেকের কাছে সর্বকালের সেরা তথ্য থাকা উচিত। ~~ আসুন এই আলোচনাটি টুইটার বা মেটাতে রাখি। শান্তি বর্ষিত হোক।
সিরো সান্তিলি 法轮功 冠状 病 六四 事件 法轮功

1
@ কুমার হার্শ উত্তর দেওয়ার মতো যথেষ্ট বিশদ নয় বলে আমি মনে করি। দয়া করে একটি নতুন সুপারিশ প্রশ্ন খুলুন।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

62

বাইনারি সামগ্রী হিসাবে ফাইলটি প্রেরণ করুন (ফর্ম বা ফর্মডাটা ছাড়াই আপলোড করুন)

প্রদত্ত উত্তর / উদাহরণগুলিতে ফাইলটি সম্ভবত (সম্ভবত) একটি HTML ফর্মের সাথে আপলোড করা বা ফর্মডাটা এপিআই ব্যবহার করে । ফাইলটি অনুরোধে প্রেরিত ডেটাগুলির একটি অংশ, তাই multipart/form-data Content-Typeশিরোনাম।

আপনি যদি কেবলমাত্র সামগ্রী হিসাবে ফাইলটি প্রেরণ করতে চান তবে আপনি সরাসরি এটি অনুরোধের অংশ হিসাবে যুক্ত করতে পারেন এবং আপনি Content-Typeযে ফাইলটি পাঠাচ্ছেন তার মাইমে টাইপের ক্ষেত্রে আপনি শিরোনামটি সেট করেন । ফাইলের নামটি Content-Dispositionহেডারে যুক্ত করা যায় । আপনি এটির মতো আপলোড করতে পারেন:

var xmlHttpRequest = new XMLHttpRequest();

var file = ...file handle...
var fileName = ...file name...
var target = ...target...
var mimeType = ...mime type...

xmlHttpRequest.open('POST', target, true);
xmlHttpRequest.setRequestHeader('Content-Type', mimeType);
xmlHttpRequest.setRequestHeader('Content-Disposition', 'attachment; filename="' + fileName + '"');
xmlHttpRequest.send(file);

আপনি যদি ফর্মগুলি ব্যবহার করতে চান (চান) এবং আপনি কেবল একটি একক ফাইল আপলোড করতে আগ্রহী হন তবে অনুরোধে আপনার ফাইল অন্তর্ভুক্ত করার এটি সহজতম উপায়।


আপনি কীভাবে Asp.Net 4.0 এর সাথে একটি সার্ভার সাইড পরিষেবা কনফিগার করবেন? এটি কি একাধিক ইনপুট প্যারামিটারগুলি যেমন হ'ল ইউজারআইডি, পাথ, ক্যাপশনটেক্সট ইত্যাদি পরিচালনা করবে?
জি

1
@ এসলেগ নাপ, এটি কেবল আপনার অনুরোধের সামগ্রী হিসাবে একটি ফাইল পাঠানোর জন্য। আমি Asp.Net বিশেষজ্ঞ নই, তবে আপনার অনুরোধটি থেকে সামগ্রীটি (একটি ব্লব) টেনে আনা উচিত এবং এটি Content-Typeশিরোনামের সাহায্যে একটি ফাইলে সংরক্ষণ করা উচিত ।
উইল্ট করুন

@ এসলেজি সম্ভবত এই লিঙ্কটি সহায়তা করতে পারে
উইল্ট

@ উইল্ট যদি আমি ফর্মটি না ব্যবহার করি তবে আমি ফর্মডেটা এপিআই ব্যবহার করতে চাই, আমি কি সেভাবে এটি করতে পারি?
ক্রুদ্ধ কিউই

1
@ অংকিতক্ষেত্রি মতামত এটি ফর্মের সাথে বা ফর্ম এপিআই ব্যবহার করে আপলোড করা হয়। এই 'অদ্ভুত স্ট্রিংস' আপনি উল্লেখ করেছেন ফর্ম সীমানা যা সাধারণত সার্ভারের অংশগুলিতে ফর্ম ডেটা আলাদা করার জন্য ব্যবহৃত হয়।
উইল্ট

9

আমার এই নমুনা জাভা কোডটি রয়েছে:

import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class TestClass {
    public static void main(String[] args) throws IOException {
        ServerSocket socket = new ServerSocket(8081);
        Socket accept = socket.accept();
        InputStream inputStream = accept.getInputStream();

        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
        char readChar;
        while ((readChar = (char) inputStreamReader.read()) != -1) {
            System.out.print(readChar);
        }

        inputStream.close();
        accept.close();
        System.exit(1);
    }
}

এবং আমি এই পরীক্ষার html ফাইল আছে:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>File Upload!</title>
</head>
<body>
<form method="post" action="http://localhost:8081" enctype="multipart/form-data">
    <input type="file" name="file" id="file">
    <input type="submit">
</form>
</body>
</html>

এবং পরিশেষে আমি যে ফাইলটি পরীক্ষার উদ্দেশ্যে ব্যবহার করব, এডাট নামের নীচের বিষয়বস্তু রয়েছে:

0x39 0x69 0x65

যদি আপনি উপরের বাইটগুলি ASCII বা UTF-8 অক্ষর হিসাবে ব্যাখ্যা করেন তবে সেগুলি আসলে উপস্থাপন করবে:

9ie

সুতরাং আসুন আমাদের জাভা কোডটি চালানো যাক, আমাদের প্রিয় ব্রাউজারে test.html খুলুন , a.datফর্মটি আপলোড করুন এবং জমা দিন এবং আমাদের সার্ভারটি কী পান তা দেখুন:

POST / HTTP/1.1
Host: localhost:8081
Connection: keep-alive
Content-Length: 196
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: null
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary06f6g54NVbSieT6y
DNT: 1
Accept-Encoding: gzip, deflate
Accept-Language: en,en-US;q=0.8,tr;q=0.6
Cookie: JSESSIONID=27D0A0637A0449CF65B3CB20F40048AF

------WebKitFormBoundary06f6g54NVbSieT6y
Content-Disposition: form-data; name="file"; filename="a.dat"
Content-Type: application/octet-stream

9ie
------WebKitFormBoundary06f6g54NVbSieT6y--

9ie চরিত্রগুলি দেখে আমি অবাক হই না কারণ আমরা জাভাটিকে তাদের ইউটিএফ -8 অক্ষর হিসাবে বিবেচনা করে মুদ্রণ করতে বলেছিলাম। আপনি এগুলি কাঁচা বাইট হিসাবে পড়তে পছন্দ করতে পারেন ..

Cookie: JSESSIONID=27D0A0637A0449CF65B3CB20F40048AF 

আসলে এখানে সর্বশেষ এইচটিটিপি শিরোলেখ। এরপরে এইচটিটিপি বডি আসে, যেখানে আমরা আপলোড করা ফাইলটির মেটা এবং সামগ্রীগুলি দেখা যায়।


6

একটি HTTP বার্তায় শিরোনামের রেখার পরে ডেটা পাঠানো হতে পারে। প্রতিক্রিয়া হিসাবে, এখানেই অনুরোধ করা সংস্থানটি ক্লায়েন্টকে (বার্তার মূল অংশের সর্বাধিক সাধারণ ব্যবহার) ফিরিয়ে দেওয়া হয়, বা কোনও ত্রুটি থাকলে সম্ভবত ব্যাখ্যামূলক পাঠ্য। একটি অনুরোধে, এটি যেখানে ব্যবহারকারী-প্রবেশ করা ডেটা বা আপলোড করা ফাইলগুলি সার্ভারে প্রেরণ করা হয়।

http://www.tutorialspoint.com/http/http_messages.htm

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.