บทคัดย่อ: ในสภาพแวดล้อมแอปพลิเคชันที่ใช้เบราว์เซอร์/เซิร์ฟเวอร์ การอัปโหลดไฟล์ประเภทต่างๆ ในเบราว์เซอร์เป็นปัญหาหนึ่งที่สร้างความเสียหายให้กับแอปพลิเคชันการจัดการไฟล์ของผู้ใช้มาโดยตลอด มีกลไกสามประการในการอัปโหลดไฟล์ใน HTTP: RFC1867, PUT และ WebDAV วิธีการนำไปใช้ทั่วไปคือการใช้ชนิดใหม่ที่นำมาใช้ใน RFC1867: วัตถุไฟล์และ ADO Stream บทความนี้จะกล่าวถึงวิธีการอัปโหลดและหลักการใช้งานข้างต้น และให้ตัวอย่างโซลูชันที่เฉพาะเจาะจง
คำสำคัญ: วัตถุ FILE คอมโพเนนต์ ASP
ในปัจจุบัน แอปพลิเคชันที่ใช้โมเดลเบราว์เซอร์/เซิร์ฟเวอร์ได้รับความนิยมมากขึ้น เมื่อผู้ใช้จำเป็นต้องถ่ายโอนไฟล์ไปยังเซิร์ฟเวอร์ หนึ่งในวิธีการทั่วไปคือการเรียกใช้เซิร์ฟเวอร์ FTP และตั้งค่าไดเร็กทอรีเริ่มต้น FTP ของผู้ใช้แต่ละรายเป็นโฮมไดเร็กตอรี่ของเว็บของผู้ใช้ เพื่อให้ผู้ใช้สามารถรันโปรแกรมไคลเอนต์ FTP และอัพโหลดไฟล์ไปยัง เว็บไดเร็กทอรีที่ระบุ สิ่งนี้ต้องการให้ผู้ใช้ทราบวิธีใช้โปรแกรมไคลเอนต์ FTP ดังนั้นโซลูชันนี้จึงใช้ได้กับผู้ใช้ที่มีประสบการณ์และคุ้นเคยกับ FTP เท่านั้น หากเราสามารถรวมฟังก์ชันอัพโหลดไฟล์เข้ากับเว็บเพื่อให้ผู้ใช้สามารถอัพโหลดงานได้โดยใช้เพียงเว็บเบราว์เซอร์ก็จะสะดวกสำหรับพวกเขามาก อย่างไรก็ตาม เนื่องจากข้อจำกัดที่ว่า File System Object สามารถส่งได้เฉพาะไฟล์ข้อความเท่านั้น ปัญหาที่ใหญ่ที่สุดของ ASP คือการอัพโหลดไฟล์ ข้อมูลต่อไปนี้จะอธิบายวิธีการอัพโหลดไฟล์ในเว็บเพจโดยใช้โปรโตคอล HTTP
หนึ่ง. สามกลไกสำหรับการอัพโหลดผ่าน HTTP
มีสามกลไกสำหรับการอัพโหลดผ่าน HTTP: RFC1867, PUT และ WebDAV
PUT เป็นกริยา HTTP ใหม่ที่นำมาใช้ใน HTTP 1.1 เมื่อเว็บเซิร์ฟเวอร์ได้รับ HTTP PUT และชื่อออบเจ็กต์ เว็บเซิร์ฟเวอร์จะตรวจสอบสิทธิ์ผู้ใช้ รับเนื้อหาของสตรีม HTTP และจัดเก็บไว้ในเว็บเซิร์ฟเวอร์โดยตรง เนื่องจากสิ่งนี้สามารถรบกวนเว็บไซต์ได้ จึงสูญเสียข้อได้เปรียบที่ใหญ่ที่สุดของ HTTP: ความสามารถในการโปรแกรมเซิร์ฟเวอร์ ในกรณีของ PUT เซิร์ฟเวอร์จะจัดการคำขอเอง: ไม่มีที่ว่างให้แอปพลิเคชัน CGI หรือ ASP เข้ามาแทรกแซง วิธีเดียวที่แอปพลิเคชันของคุณจะจับภาพ PUT คือการทำงานในระดับต่ำ ซึ่งก็คือเลเยอร์การกรอง ISAPI ด้วยเหตุผลที่สอดคล้องกัน การประยุกต์ใช้ PUT จึงมีจำกัดมาก
WebDAV อนุญาตให้มีการรับรองความถูกต้องแบบกระจายและการแปลเนื้อหาเว็บ โดยแนะนำคำกริยา HTTP ใหม่หลายคำที่อนุญาตให้อัปโหลด ล็อค/ปลดล็อค และเช็คอิน/ตรวจสอบเนื้อหาเว็บผ่าน HTTP "บันทึกลงเว็บ" ใน Office 2000 ใช้งานผ่าน WebDAV หากคุณสนใจเพียงแค่การอัปโหลดเนื้อหา WebDAV ก็ทำงานได้ดีและแก้ปัญหาได้มากมาย อย่างไรก็ตาม หากคุณต้องการอัปโหลดไฟล์ภายในเว็บแอปพลิเคชันของคุณ WebDAV จะไม่มีประโยชน์สำหรับคุณ เช่นเดียวกับ HTTP PUT กริยา WebDAV เหล่านั้นจะถูกตีความโดยเซิร์ฟเวอร์ ไม่ใช่เว็บแอปพลิเคชัน คุณต้องทำงานกับเลเยอร์การกรอง ISAPI เพื่อเข้าถึงคำกริยาเหล่านี้ของ WebDAV และตีความเนื้อหาในแอปพลิเคชันของคุณ
RFC1867 ( http://www.ietf.org/rfc/rfc1867.txt ) ถูกใช้เป็นมาตรฐานที่เสนอก่อนที่ W3C จะยอมรับใน HTML3.2 ในที่สุด เป็นแนวคิดที่เรียบง่ายแต่ทรงพลัง: กำหนดประเภทใหม่ในช่องแบบฟอร์ม
<INPUT TYPE="FILE">
และเพิ่มรูปแบบการเข้ารหัสที่แตกต่างกันให้กับแบบฟอร์ม แทนที่จะใช้แบบทั่วไป:
<FORM ACTION="formproc.asp" METHOD="POST">
แต่ใช้:
<FORM ACTION="formproc .asp " METHOD="POST" ENCTYPE="multipart/form-data">
รูปแบบการเข้ารหัสนี้มีประสิทธิภาพมากกว่ารูปแบบการเข้ารหัสแบบฟอร์ม "application/x-url-encoded" ที่เป็นค่าเริ่มต้นเมื่อส่งข้อมูลจำนวนมาก สูงกว่ามาก การเข้ารหัส URL มีชุดอักขระที่จำกัดมาก อักขระใดๆ ที่เกินชุดอักขระจะต้องถูกแทนที่ด้วย '%nn' โดยที่ nn แทนเลขฐานสิบหก 2 หลักที่สอดคล้องกัน ตัวอย่างเช่น แม้แต่อักขระเว้นวรรคธรรมดาก็ควรแทนที่ด้วย '%20' ในทางกลับกัน RFC1867 ใช้การเข้ารหัส MIME หลายส่วน ดังที่เห็นโดยทั่วไปในข้อความอีเมล เพื่อส่งข้อมูลจำนวนมากโดยไม่ต้องเข้ารหัส แต่มีส่วนหัวที่เรียบง่ายแต่มีประโยชน์เพียงไม่กี่รายการที่อยู่รอบๆ ข้อมูล ผู้ผลิตเบราว์เซอร์รายใหญ่ได้นำปุ่ม "เรียกดู..." ที่แนะนำมาใช้ และผู้ใช้สามารถใช้กล่องโต้ตอบ "เปิดไฟล์..." ในเครื่องเพื่อเลือกไฟล์ที่จะอัปโหลดได้อย่างง่ายดาย
RFC1867 ยังคงเหลือวิธีการที่ยืดหยุ่นส่วนใหญ่ในการอัพโหลดไฟล์ไปยังเว็บแอปพลิเคชันของคุณ PUT มีการใช้งานที่จำกัดมาก WebDAV มีประโยชน์สำหรับผู้เขียนเนื้อหา เช่น ผู้ใช้ FrontPage แต่จะมีประโยชน์น้อยกว่าสำหรับนักพัฒนาเว็บที่ต้องการรวมการอัพโหลดไฟล์ลงในเว็บแอปพลิเคชันของตน ดังนั้น RFC1867 จึงเป็นวิธีที่ดีที่สุดในการรวมการอัพโหลดไฟล์ไว้ในเว็บแอปพลิเคชัน
ในการใช้งานจริง Microsoft จัดให้มี Posting Acceptor ฟรี ASP ไม่เข้าใจรูปแบบการเข้ารหัส "หลายส่วน/ฟอร์ม-ข้อมูล" Microsoft จัดเตรียม Posting Acceptor ซึ่งเป็นแอปพลิเคชัน ISAPI ที่ยอมรับ REPOST ไปยังเพจ ASP หลังจากการอัปโหลดเสร็จสมบูรณ์
SA-FileUp ของ Software Artisans เป็นหนึ่งในส่วนประกอบ Active Server เชิงพาณิชย์กลุ่มแรกๆ หลังจากการปรับปรุงหลายประการ ขณะนี้มีอยู่เป็นส่วนประกอบ ASP ล้วนๆ
สอง.
หลักการพื้นฐานของการวิเคราะห์หลักการใช้งานการอัปโหลดไฟล์ตาม ASP
คือ: ใช้วิธี BinaryRead ของวัตถุ ADO Stream เพื่ออ่านข้อมูลทั้งหมดใน FORM สกัดกั้นข้อมูลไฟล์ที่จำเป็น และบันทึกเป็นไฟล์ไบนารี
นี่คือตัวอย่างหน้าการอัพโหลดไฟล์ (upload.htm):
<html>
<ร่างกาย>
<ชื่อแบบฟอร์ม = "อัปโหลด" วิธีการ = "โพสต์" Enctype = "การกระทำหลายส่วน/แบบฟอร์มข้อมูล" = "อัปโหลด.asp">
<input type="file" name="FileName">
<INPUT TYPE="ส่ง" VALUE="อัปโหลด"></TD>
</แบบฟอร์ม>
</ร่างกาย>
</html>
ออบเจ็กต์ไฟล์ถูกใช้ในโปรแกรม ดังนั้นข้อมูลต้นฉบับที่อ่านโดยใช้วิธี BinaryRead ใน Upload.asp ไม่เพียงแต่เป็นข้อมูลของไฟล์ที่เลือกเท่านั้น แต่ยังรวมถึงเส้นทาง ประเภท และการส่งไฟล์ด้วย บนฮาร์ดดิสก์ของผู้ใช้ คำอธิบายชื่อโดเมน และข้อมูลอื่นๆ ที่เกี่ยวข้องของเพจ เพื่อที่เราจะต้องแยกเนื้อหาเฉพาะของไฟล์ จากการวิเคราะห์ เส้นแบ่งระหว่างข้อมูลส่วนหัวและข้อมูลคือการขึ้นบรรทัดใหม่และการป้อนบรรทัดสองคู่ และยังมีข้อมูลการแยกที่ส่วนท้าย เราสามารถรับข้อมูลไฟล์โดยใช้วิธีการที่คล้ายกับต่อไปนี้
Dim FormData.FormSize,DataStart,CLStr,DivStr
FormSize=คำขอ.TotalBytes
FormData=Request.BinaryRead(FormSize)
CLStr=ChrB(13)&ChrB(10)
DataStart=InStrB(FormData.CLStr&CLStr)+4
'4 คือความยาวของอักขระขึ้นบรรทัดใหม่และการป้อนบรรทัดสองคู่
DivStr=LeftB(FormData,InStrB(FormData,CLStr)-1)
DataSize=InStrB(DataStart+1,FormData,DivStr)-DataStart-2
FormData=MidB(FormData,DataStart,DataSize)
FormData คือเนื้อหาของไฟล์
การประมวลผลที่สอดคล้องกันสามารถดำเนินการได้ตามต้องการ สิ่งสุดท้ายที่ต้องทำคือบันทึกไฟล์ มีสองวิธีในการบันทึก: วิธีหนึ่งคือการใช้วิธีการดำเนินการไฟล์ไบนารีในโปรแกรมเช่น VB หรือ VC เพิ่มไลบรารีประเภทที่เหมาะสมให้กับโครงการ และสุดท้ายรวบรวมเป็นไฟล์ DLL จากนั้นลงทะเบียนไฟล์ DLL เมื่อใช้งาน มัน. . ขั้นตอนการจัดเก็บไฟล์เป็นดังนี้:
ฟังก์ชั่นสาธารณะ SaveFile(Pathname As String) As String
หรี่ objContext เป็น ObjectContext
Dim objRequest ตามคำขอ
ตั้งค่า objContext=GetObjectContext()
ตั้งค่า objRequest=objContext("คำขอ")
'โค้ดต่อไปนี้เกี่ยวข้องกับการดำเนินการจัดเก็บไฟล์ Dim FormData() As Byte, CLStr, DivStr
Dim DataStart ตราบเท่าที่ DataSize ตราบเท่าที่
DataSize=objRequest.TotalBytes
Redim FormData (DataSize-1)
FormData=objRequest.BinaryRead(ขนาดข้อมูล)
CLStr=ChrB(13) & ChrB(10)
DataStart=InStrB(FormData,CLStr & CLStr)+4
DivStr=LeftB(FormData,InStrB(FormData,CLStr)-1)
DataSize=InStrB(DataStart+1,FormData,DivStr)-DataStart-2
FormData=MidB(FormData,DataStart,DataSize)
'สร้างไฟล์ไบนารี่และเขียน FormData ลงไป Open Pathname For Binary As 1
ใส่ #1,,FormData
ปิด #1
SaveFile="ตกลง!"
ของฟังก์ชันสิ้นสุด
คือการใช้วิธีการดำเนินการไฟล์ไบนารีที่มีให้ใน ADO STREAM คำสั่งที่จะบันทึกไฟล์คือ: StreamOBJ.SaveToFile (fileName,2) ในการดำเนินการประเภทนี้ เราสามารถจัดเก็บการดำเนินการที่เกี่ยวข้องไว้ในไฟล์คลาสได้ และเมื่อนำไปใช้งาน เพียงแค่รวมไฟล์คลาสไว้ในโปรแกรม ASP โดยตรง สำหรับวิธีการประมวลผลเฉพาะ โปรดดูบทนำที่เกี่ยวข้อง
สาม. อินสแตนซ์วิธีการอัปโหลดไฟล์
สามารถใช้คอมโพเนนต์หรือวิธีไม่มีคอมโพเนนต์เพื่อดำเนินการอัปโหลดไฟล์ สำหรับหมวดหมู่ส่วนประกอบ เช่น Microsoft Posting Acceptor (เรียกสั้น ๆ ว่า MPA) เป็นส่วนประกอบเซิร์ฟเวอร์ฟรีที่ Microsoft เผยแพร่ การติดตั้งส่วนประกอบประเภทนี้ก็ค่อนข้างสะดวกเช่นกัน สำหรับ mpa ของ Microsoft เพียงเรียกใช้ไฟล์การติดตั้ง สำหรับส่วนประกอบ dll ทั่วไป เราจำเป็นต้องลงทะเบียนส่วนประกอบเหล่านั้น ตัวอย่างเช่น หากต้องการใช้ aspcnUP.dll คุณจะต้องดำเนินการ regsvr32 [path]aspcnUP.dll บน Window 2000 เท่านั้น และระบบจะแจ้งให้คุณทราบข้อความการลงทะเบียนที่สำเร็จ และคุณสามารถใช้ส่วนประกอบสำหรับคลาสที่ไม่มีส่วนประกอบได้ เช่น Component upload ของ www.5xsoft.com class-upload_5xsoft เมื่อใช้งาน เพียงใส่คำสั่งต่อไปนี้ในตัวจัดการ:
<!--#include FILE="upload.inc"-->
สำหรับคุณสมบัติและวิธีการดำเนินการที่เกี่ยวข้องกับ
การสร้างวัตถุอัพโหลด
โปรดดูคู่มือผู้ใช้ของส่วนประกอบนี้ต่อไปนี้เป็นซอร์สโค้ดสำหรับการอัปโหลดไฟล์บางประเภท (upload.asp) โดยใช้คอมโพเนนต์ aspcnUP.dll เป็นตัวอย่าง:
<% @ language="vbscript"
ตั้งค่า fileUP=Server.CreateObject("aspcn.Upload")
fileUP.Maxsize=200000
fileUP.Path="d:upfile"
fileUP.อัพโหลด
สำหรับ i=0 ถึง fileUP.Count
fieldname=fileUP.FieldName(i)
ถ้า fileUP.FileType(fieldname)="zip" หรือ ileUP.FileType(fieldname)="rar" จากนั้น
fileUP.บันทึกชื่อฟิลด์
สิ้นสุดถ้า
ต่อไป
ตั้งค่า fileUP=ไม่มีอะไร
%>
สี่
โมเดลแอปพลิเค
ชันเบราว์เซอร์/เซิร์ฟเวอร์ยังคงพัฒนาอย่างรวดเร็วใน ASP ที่เพิ่งเปิดตัวใหม่ของ Microsoft NET มีฟังก์ชันอัพโหลดไฟล์ในตัว ซึ่งใช้งานง่ายและสะดวกมาก ในฐานะเทคโนโลยีใหม่ล่าสุด ASP NET ไม่ใช่แค่การอัพเกรด ASP อย่างง่ายๆ แต่ยังเป็นเฟรมเวิร์กใหม่ล่าสุดสำหรับการพัฒนาเว็บที่มีคุณลักษณะใหม่ๆ มากมาย งูเห่า. NET ให้โค้ดที่เขียนง่ายกว่าและมีโครงสร้างที่ชัดเจนกว่า เมื่อใช้โค้ดเหล่านี้ เราจะนำโค้ดเหล่านี้ไปใช้ซ้ำและแบ่งปันได้ง่ายขึ้น ซึ่งจะเป็นการพัฒนาโปรแกรมที่ใช้งานได้จริงมากขึ้นเรื่อยๆ