ฉันพบข้อกำหนดดังกล่าวในงานของฉันและฉันต้องใช้ NodeJS เพื่ออัปโหลดไฟล์ ฉันเคยรู้วิธีอัปโหลดไฟล์ผ่านเบราว์เซอร์เท่านั้น ถ้าฉันใช้ nodejs มันจะเทียบเท่ากับการจำลองพฤติกรรมของเบราว์เซอร์ หลังจาก Google ฉันรู้ว่าเบราว์เซอร์ใช้โปรโตคอล HTTP เพื่อส่งข้อมูลไปยังเซิร์ฟเวอร์ โปรโตคอลที่เฉพาะเจาะจงคือ "RFC 1867 - การอัปโหลดไฟล์ตามแบบฟอร์มใน HTML" การอัปโหลดไฟล์ผ่านแบบฟอร์มฟอร์มบนเบราว์เซอร์ผ่านโปรโตคอลนี้ ก่อนอื่นเราจะเห็นว่าเบราว์เซอร์ส่งข้อมูลไปยังเซิร์ฟเวอร์ก่อนจากนั้นเราสามารถใช้ฟังก์ชั่นการอัปโหลดได้ตามสำเนา เมื่อพูดถึงการอัปโหลดไฟล์ในแบบฟอร์มแบบฟอร์มทุกคนควรคุ้นเคยกับ:
<form action = "http://www.qq.com/" method = "post"> <input type = "text" name = "text1" /> <br /> <input type = "text" name = "text2" /> <br /> <อินพุต type = "ส่ง" /> < /form>
เมื่อส่งคุณจะเห็นว่าข้อมูลต่อไปนี้จะถูกส่งไปยังเซิร์ฟเวอร์โดยใช้ Fiddler เพื่อจับแพ็คเก็ต:
โพสต์ http://www.qq.com/ http/1.1
โฮสต์: www.qq.com
ความยาวเนื้อหา: 23
ประเภทเนื้อหา: แอปพลิเคชัน/x-www-form-urlencoded; charset = utf-8
Text1 = Hello & Text2 = World
เป็นที่น่าสังเกตว่าค่าเริ่มต้นประเภทเนื้อหาเป็นแอปพลิเคชัน/X-WWW-FORM-URLENCODED ดังนั้นข้อความจะถูกเข้ารหัส URL ตัวอย่างเช่น "สวัสดี" จะถูกเข้ารหัสเป็น%e4%bd%a0%e5%a5%bd
จากนั้นมาดูกันว่าการอัปโหลดแบบฟอร์ม ทุกคนควรคุ้นเคยกับ:
<form action = "http://www.qq.com" method = "post" enctype = "multipart/form-data"> <input type = "file" name = "myFile"/> <อินพุต type = "ส่ง" value = "ส่ง"/> </form>
จากนั้นสร้างไฟล์ข้อความ upload.txt ใหม่โดยมีเพียงคำสวัสดีโลกและอัปโหลด เราใช้ Fiddler เพื่อคว้าแพ็คเกจ เราสามารถพบว่าการส่งข้อมูลที่ผ่านมานั้นซับซ้อนกว่าเล็กน้อย (สายคำขออื่น ๆ ที่ไม่เกี่ยวข้องอื่น ๆ ได้ถูกลบออกเช่นการควบคุมแคชและคุกกี้):
โพสต์ http://www.qq.com/ http/1.1
โฮสต์: www.qq.com
ความยาวเนื้อหา: 199
เนื้อหาประเภท: multipart/form-data; ขอบเขต = --- WebKitFormBoundaryWr3x7SxByqq4ZF5G
----- WebKitFormboundaryWr3x7sxbyqq4zf5g
เนื้อหาการกระจาย: ฟอร์ม-ข้อมูล; name = "myfile"; filename = "upload.txt"
ประเภทเนื้อหา: ข้อความ/ธรรมดา
สวัสดีโลก
----- WebKitFormboundaryWr3x7sxbyqq4zf5g-
ตามคำจำกัดความของ RFC 1867 เราจำเป็นต้องสร้างชิ้นส่วนของข้อมูลขอบเขต ข้อมูลนี้ไม่สามารถปรากฏขึ้นที่อื่นในเนื้อหา สิ่งนี้สามารถกำหนดได้ด้วยตัวเอง อัลกอริทึมการสร้างของแต่ละเบราว์เซอร์อาจแตกต่างกัน ขอบเขตข้างต้นคือการแยกข้อมูล หลังจากสร้างข้อมูลที่คั่นด้วยข้อมูลที่คั่นสามารถวางไว้ในประเภทเนื้อหาที่หัวและส่งไปยังเซิร์ฟเวอร์นั่นคือเนื้อหาประเภทข้างต้น: หลายส่วน/ฟอร์ม-ข้อมูล; Boundary = --- WebKitFormBoundaryWr3x7SxByqq4ZF5G นอกจากนี้เนื้อหาที่อัปโหลดจะต้องแยกออกเป็นหลายส่วนด้วยข้อมูลแยกต่างหากและแต่ละส่วนของข้อมูลมีชื่อไฟล์และชื่อเมื่ออัปโหลด เซิร์ฟเวอร์ใช้ชื่อนี้เพื่อรับไฟล์และประเภทเนื้อหาประเภทไฟล์ ในตัวอย่างนี้ข้อความ/ธรรมดา หากอิมเมจ PNG ที่อัปโหลดเป็นรูปภาพ/PNG จะเป็น Image/PNG หลังจากบรรทัดที่ว่างเปล่าของประเภทไฟล์เนื้อหาของไฟล์ที่อัปโหลดนั้นง่ายต่อการเข้าใจ ในตัวอย่างนี้ไฟล์ข้อความที่อัปโหลดเป็นเพื่อให้เนื้อหาสามารถแสดงได้โดยตรง หากไฟล์อิมเมจที่อัปโหลดเป็นไฟล์ไบนารี Fiddler จะแสดงรหัสที่เล่นได้ หลังจากเนื้อหาของไฟล์สิ้นสุดลงจะมีบรรทัดที่ว่างเปล่าบวกกับข้อมูลขอบเขต
หลังจากทำความเข้าใจรายละเอียดของรูปแบบการส่งขั้นตอนต่อไปคือการใช้ NODEJS เพื่อโปรแกรมและนำไปใช้ เพียงแค่ใส่เพียงส่งข้อมูลไปยังเซิร์ฟเวอร์ตามรูปแบบ
const http = require ('http'); const fs = require ('fs'); // ที่อยู่โพสต์คือ php ในบริการท้องถิ่นใช้เพื่อทดสอบว่าการอัปโหลดเป็นตัวเลือก var ที่ประสบความสำเร็จ = {โฮสต์ชื่อ: 'localhost', พอร์ต: 80, เส้นทาง: '--- WebKitFormBoundaryJlvkBQXTII0YGPAB'; // อ่านเนื้อหาไฟล์ที่ต้องอัปโหลด fs.ReadFile ('./ upload.txt', ฟังก์ชั่น (err, data) {// โดดเด่นส่วนข้อมูลที่แยกจากกัน var payload = '-' + boundarykey + '/r/n' + 'เนื้อหา-/r/r/r/r/r/r/n' 'ประเภทเนื้อหา: ข้อความ/plain/r/n/r/n'; payload + = data; payload + = '/r/n--' + BoundaryKey + '-'; // ส่งคำขอ var req = http.request (ตัวเลือก, ฟังก์ชั่น (res) {res.setencoding ('utf8'); chunk);});}); req.on ('ข้อผิดพลาด', ฟังก์ชั่น (e) {console.error ("ข้อผิดพลาด:"+e);}); // เขียนขอบเขตขนาดของข้อมูลที่จะส่งและข้อมูลลงในคำขอ req.setheader ( Boundary = '+BoundaryKey+' '); req.setheader (' ความยาวเนื้อหา ', buffer.byTelength (payload,' utf8 ')); req.write (payload); req.end ();});จุดเน้นของบทความนี้คือการเข้าใจโปรโตคอลและนำไปใช้กับรหัส ยังมีการเพิ่มประสิทธิภาพมากมายในองค์กรรหัส
ในที่สุดใน Apache ท้องถิ่นเพียงเขียน PHP เพื่อบันทึกไฟล์ที่อัปโหลดเพื่อใช้เป็นการทดสอบ:
<? php $ filepath = './upload.txt';move_uploaded_file($_files [myfile' เหมือนกัน ['tmp_name '], $ filepath); echo "ตกลง";?>?>
นอกจากนี้ตาม RFC 1867 ฟังก์ชั่นของการอัปโหลดหลายไฟล์ในครั้งเดียวสามารถรับรู้ได้ สิ่งนี้จะไม่ถูกอธิบายในรายละเอียดที่นี่ หากจำเป็นให้อ้างถึง RFC 1867 สำหรับการใช้งานโดยละเอียด
ข้างต้นคือการอัปโหลดไฟล์ node.js ที่แนะนำโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!