<การกระทำของแบบฟอร์ม=upload.asp method=post enctype=multipart/form-data>
อัพโหลดไฟล์:<Input type=file name=file1><br>
<ประเภทอินพุต=ชื่อส่ง=ค่าอัพโหลด=อัพโหลด>
</แบบฟอร์ม>
พารามิเตอร์ enctype ใช้เพื่อตั้งค่าวิธีการเข้ารหัส MIME ของแบบฟอร์ม เมื่ออัปโหลดไฟล์ (หรือมีกล่องข้อความในเวลาเดียวกัน) จะต้องตั้งค่าแอตทริบิวต์เป็น multipart/form-data ไฟล์ไบนารีฝั่งเซิร์ฟเวอร์ที่ได้รับ โปรแกรม ASP สำหรับการประมวลผลกระแสข้อมูลจะถูกนำมาใช้ในบทความนี้
2. อัปโหลดการวิเคราะห์รูปแบบไฟล์
ก่อนที่จะประมวลผลไฟล์ เราต้องเข้าใจรูปแบบเฉพาะของไฟล์ที่อัพโหลดก่อน เราสามารถดูรหัสไบนารี่ของมันได้โดยการเขียนโปรแกรม ASP ง่ายๆ ต่อไปนี้:
-
ขนาดไฟล์=Request.TotalBytes 'รับขนาดของไฟล์ที่อัพโหลด
filedata=Request.BinaryRead(filesize) 'รับข้อมูลไบนารี่ของไฟล์ที่อัพโหลด
ข้อมูลไฟล์ Response.BinaryWrite 'แสดงข้อมูลไบนารีบนเบราว์เซอร์
-
จากการวิเคราะห์รหัสไบนารี่ของไฟล์ที่อัพโหลดที่แสดงบนเบราว์เซอร์ เราพบว่ารหัสประกอบด้วยสี่ส่วน (หากอัพโหลดไฟล์หรือกล่องข้อความหลายไฟล์พร้อมกัน รหัสจะถูกจัดเรียงตามลำดับการอัพโหลดโดยมีรูปแบบเดียวกัน ) และเนื้อหาของแต่ละส่วนจะถูกป้อนด้วยการขึ้นบรรทัดใหม่ คั่นด้วยอักขระขึ้นบรรทัดใหม่:
1) ส่วนแรก (ธงเริ่มต้น)
-------------------------------7d329631b04d4
2) ส่วนที่ 2 (คำอธิบายเอกสาร)
การจัดการเนื้อหา: form-data; name=file1; filename=C:/Documents and Settings/Administrator/My Documents/Invitation.doc Content-Type: application/msword
ที่นี่ เราจะรับชื่อไฟล์และเส้นทางที่แน่นอนของไฟล์ที่อัปโหลด รวมถึงประเภทไฟล์ ข้อมูลนี้จำเป็นต่อการบันทึกไฟล์อย่างถูกต้อง
3) ส่วนที่ 3 (เนื้อหาเอกสาร)
นั่นคือละเว้นเนื้อหาไบนารีของไฟล์
4) ส่วนที่ 4 (เครื่องหมายสิ้นสุด)
-------------------------------7d329631b04d4
รวมเนื้อหาของภาคแรกและภาคที่สี่ -----------------------------7d329631b04d4 (ค่าจะต่างกันทุกครั้งที่อัพโหลด) ) เหมือนกัน) ทำหน้าที่เป็นตัวคั่นซึ่งทำเครื่องหมายจุดเริ่มต้นและจุดสิ้นสุดของข้อมูล (เมื่อมีเนื้อหาที่อัปโหลดหลายรายการ) ในส่วนของข้อมูลที่จำเป็นในการบันทึกไฟล์ อันดับแรกเราต้องได้รับชื่อไฟล์จากชื่อไฟล์ของส่วนที่สองของข้อมูล จากนั้นเราจำเป็นต้องค้นหาตำแหน่งเริ่มต้นของไฟล์ให้ถูกต้อง และสุดท้ายใช้เทคโนโลยี ASP เพื่อบันทึก ไฟล์ไบนารี่ที่มีชื่อไฟล์ดั้งเดิม หากมีการอัปโหลดเนื้อหาหลายรายการ (เช่น กล่องข้อความและไฟล์หลายรายการ) พร้อมกัน เนื้อหาเหล่านั้นจะได้รับการประมวลผลในลักษณะเดียวกัน เนื้อหาแต่ละส่วนจะรวมอยู่ในตัวคั่น แต่กล่องข้อความและไฟล์จะแสดงในรูปแบบที่แตกต่างกันเล็กน้อย ซึ่งสามารถทำได้โดยการวิเคราะห์รหัสไบนารี่โดยเฉพาะเพื่อทำความเข้าใจ
3. ใช้เทคโนโลยี ASP เพื่อใช้พื้นที่จัดเก็บไฟล์
กำลังประมวลผลโค้ดไฟล์ที่อัปโหลด
1) รับรหัสตัวคั่น
จากการวิเคราะห์ข้างต้น เราทราบแล้วว่าตัวคั่นมีบทบาทสำคัญในการแบ่งส่วนข้อมูลหลายส่วน (รวมถึงกล่องข้อความและไฟล์ประเภทต่างๆ) ดังที่ได้รับการวิเคราะห์ก่อนหน้านี้ ตัวคั่นจะปรากฏขึ้นก่อนสัญลักษณ์แคร่แคร่แรกและสัญลักษณ์ป้อนบรรทัด ดังนั้นสามารถรับรหัสตัวคั่นได้จากโปรแกรมต่อไปนี้:
-
newline=chrB(13) & chrB(10) 'newline แสดงถึงอักขระส่งคืนเลขฐานสอง
ขนาดไฟล์=Request.TotalBytes 'คือขนาดของไฟล์ที่อัพโหลด
filedata=Request.BinaryRead(filesize) 'filedata คือข้อมูลไบนารี่ของไฟล์ที่อัพโหลด
divider=leftB(filedata,clng(instrb(filedata,newline))-1) 'divider คือตัวแบ่ง
-
หมายเหตุ: เนื่องจากเรากำลังจัดการกับไบนารีไบต์โค้ดที่นี่ ฟังก์ชันทั้งหมดจึงใช้เวอร์ชันไบนารี โดยเพิ่ม b
2) รับเนื้อหาไฟล์ (หรือกล่องข้อความ)
(1) ฟังก์ชั่นเตรียมการ (แปลงสตริงไบนารีเป็นสตริง)
เนื้อหาของไฟล์ที่อัปโหลดไม่จำเป็นต้องผ่านกระบวนการแปลงจากไบนารีเป็นสตริง และสามารถบันทึกได้โดยตรง อย่างไรก็ตาม หากคุณต้องการแยกเนื้อหาของกล่องข้อความหรือชื่อไฟล์ คุณต้องทำการแปลง ดังนั้นจึงจำเป็นต้องเขียนฟังก์ชันการแปลงสากลที่เหมาะกับอักขระภาษาจีน ต่อไปนี้เป็นรหัสฟังก์ชัน:
ฟังก์ชั่น BtoS (bstr)
ถ้าไม่เป็น Null (bstr) แล้ว
สำหรับ i = 0 ถึง lenb(bstr) - 1
bchr = midb(bstr,i+1,1)
ถ้า ascb(bchr)>127 ดังนั้น 'อักขระภาษาจีนเป็นไบต์คู่ ดังนั้นจึงต้องประมวลผลอักขระสองตัวพร้อมกัน
temp = temp&chr(ascw(midb(bstr, i+2, 1)&bchr))
ฉัน = ฉัน+1
อื่น
temp = temp&chr(ascb(bchr))
สิ้นสุดถ้า
ต่อไป
สิ้นสุดถ้า
BtoS=อุณหภูมิ
ฟังก์ชันสิ้นสุด
(2) รับเนื้อหาของไฟล์ (หรือกล่องข้อความ)
ในแอปพลิเคชันเว็บจริง การอัปโหลดอาจเกี่ยวข้องกับเนื้อหาหลายรายการ เช่น กล่องข้อความหลายกล่อง ไฟล์หลายไฟล์ เป็นต้น ไฟล์และกล่องข้อความสามารถแยกแยะได้ง่าย ข้อมูลไฟล์ประกอบด้วย filename= string ดังนั้นเราจึงเขียนฟังก์ชันทั่วไปต่อไปนี้ ซึ่งสามารถใช้เพื่อแยกเนื้อหาไฟล์และเนื้อหากล่องข้อความ (จำเป็นต้องมีการแปลงไบนารี):
ฟังก์ชั่น getdata (ข้อมูล byval, ตัวแบ่ง byval, สุดท้าย) 'data แสดงถึงสตริงไบนารี่; ตัวแบ่งหมายถึงตัวคั่น; Final แสดงถึงตำแหน่งสิ้นสุดของข้อมูล
filename=chrb(102)&chrb(105)&chrb(108)&chrb(101)&chrb(110)&chrb(97)&chrb(109)&chrb(101)&chrb(61)&chrb(34) 'การแสดงไบนารี่ของชื่อไฟล์สตริง=
bncrlf=chrb(13)&chrb(10) 'อักขระส่งคืนเลขฐานสอง
startpos = instrb (ข้อมูล, ตัวแบ่ง) + lenb (ตัวแบ่ง) + lenb (bncrlf) 'ตำแหน่งเริ่มต้น
endpos = instrb(startpos,data,divider)-lenb(bncrlf) 'ตำแหน่งสิ้นสุด
part1 = midb(data, startpos, endpos-startpos) 'เนื้อหาระหว่างตัวคั่นสองตัว
firstline = midb(part1, 1, instrb(part1, bncrlf)-1) ' ย่อหน้าคำอธิบายก่อนเนื้อหา
ถ้า (instrb(firstline,filename)=0) จากนั้น 'ถ้าเป็นกล่องข้อความ ให้รับเนื้อหาสตริงของกล่องข้อความ
Stemp=midb(ส่วนที่ 1,คำแนะนำ(ส่วนที่ 1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf),lenb(ส่วนที่ 1)-instrb(ส่วนที่ 1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
getdata=BtoS(ขั้นตอน)
อย่างอื่น 'หากเป็นไฟล์ ให้รับเนื้อหาไบนารีของไฟล์
Getdata=midb (ตอนที่ 1, instrb (ตอนที่ 1, bncrlf&bncrlf)+lenb (bncrlf&bncrlf), lenb (ตอนที่ 1)
-instrb(ส่วนที่ 1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
สิ้นสุดถ้า
สุดท้าย=จุดสิ้นสุด
สิ้นสุดฟังก์ชัน
คุณสามารถรับเนื้อหาไฟล์ที่ต้องการ (หรือกล่องข้อความ) ได้โดยการเรียกใช้ฟังก์ชันนี้โดยตรงในโปรแกรม ดังที่แสดงด้านล่าง:
-
Content=getdata (ข้อมูล ตัวแบ่ง ตำแหน่ง)
-
3) รับชื่อไฟล์
ตามที่ได้วิเคราะห์ไปแล้ว ฟิลด์ filename= ของสตรีมข้อมูลไฟล์อัปโหลดจะมีชื่อและพาธสัมบูรณ์ของไฟล์ โดยทั่วไปแล้ว เราจำเป็นต้องแยกชื่อไฟล์ในพาธเท่านั้น ต่อไปนี้คือโค้ดโปรแกรม:
-
namepos=instrrev(B2S(firstline),chr(92)) 'firstline คือข้อมูลส่วนคำอธิบายที่ได้รับข้างต้น chr(92)
ด่วน/
filename=midb(firstline,namepos+1,lenb(firstline)-namepos-1) 'รับชื่อไฟล์
-
ใช้ ASP เพื่อใช้ฟังก์ชันอัพโหลดไฟล์โดยตรง
โปรแกรมเมอร์ ASP แบบดั้งเดิมสามารถใช้เฉพาะวัตถุ FILESYSTEMOBJECT เพื่อย้าย คัดลอก ลบ และการดำเนินการอื่นๆ บนไฟล์ข้อความ (.txt) หากจำเป็นต้องประมวลผลวัตถุไบนารี พวกเขาต้องใช้วิธีที่แนะนำไว้ก่อนหน้าในบทความนี้ อย่างไรก็ตาม ขณะนี้วัตถุ ADO.STREAM ใน ASP สามารถดำเนินการกับวัตถุข้อความและวัตถุไบนารีได้ในเวลาเดียวกัน (สามารถดาวน์โหลดได้ที่ http://www.microsoft.com/data) และคุณสามารถใช้วัตถุดังกล่าวเพื่อปรับใช้การอัปโหลดไฟล์ได้โดยตรง ฟังก์ชั่นใน ASP ด้านล่างนี้ เราจะแนะนำขั้นตอนการดำเนินการ
1) เปิดวัตถุ STREAM
สำหรับออบเจ็กต์ SREAM หากคุณต้องการบันทึกไฟล์ คุณต้องบันทึกเนื้อหาทั้งหมดของออบเจ็กต์ ดังนั้นเราจึงต้องสร้างออบเจ็กต์ STREAM สองรายการ (หรือมากกว่า) หนึ่งในนั้นคือสตรีมข้อมูลต้นทาง ซึ่งรับข้อมูลไบนารีเริ่มต้น และอีกอันคือสตรีมข้อมูลปลายทาง ซึ่งรับข้อมูลที่ประมวลผลจากสตรีมข้อมูลต้นทาง และสุดท้าย บันทึกลงในไฟล์ที่ต้องการ
-
set str=server.CreateObject(ADODB.Stream) 'str คือสตรีมข้อมูลต้นทาง
str.Mode=3 'ตั้งค่าโหมดเปิด 3 สามารถอ่านและเขียนได้
str.Type=1 'ตั้งค่าประเภทข้อมูล 1 เป็นข้อมูลไบนารี่
str.เปิด
set desc=server.CreateObject(ADODB.Stream) 'desc คือสตรีมข้อมูลเป้าหมาย
อธิบายMode=3
ประเภทเรียง=1
อธิบายเปิด
-
2) การคัดลอกเนื้อหาระหว่างวัตถุ STEAM
ในส่วนนี้ คุณต้องค้นหาจุดเริ่มต้นของไฟล์ในสตรีมข้อมูลต้นทางและค้นหาความยาวของเนื้อหาไฟล์ก่อนจึงจะสามารถคัดลอกไฟล์ไปยังสตรีมข้อมูลปลายทางได้อย่างถูกต้องและบันทึกไฟล์ รหัสโปรแกรมจะเป็นดังนี้:
-
formdata=Request.BinaryRead(Request.TotalBytes) 'formdata เป็นเนื้อหาที่อัพโหลดทั้งหมด
str.Write formdata ' สตรีมข้อมูลแหล่งที่มาของการกำหนด
str.position=count-lenb(result)-2 'ตำแหน่งชี้ไปที่จุดเริ่มต้นของไฟล์
str.copyto desc, lenb(filecotent) 'lenb(filecontent) แสดงถึงความยาวของไฟล์
desc.SaveToFile fullpath,2 'บันทึกไฟล์ด้วยพาธและชื่อที่ระบุโดย fullpath'
-
3) ปิดวัตถุ STEAM
เมื่อการเขียนโปรแกรมเสร็จสมบูรณ์ อ็อบเจ็กต์ STEAM ควรถูกปิดและปล่อยดังนี้:
-
คำอธิบาย ปิด
ตั้งค่า desc=nothing
ถ.ปิด
ตั้งค่า STR=ไม่มีอะไร
-
สรุป
บทความนี้จะให้วิธีการปรับใช้การอัพโหลดไฟล์โดยตรงโดยใช้ ASP ซึ่งได้รับการนำไปใช้อย่างดีในระบบการจัดการข้อมูลที่พัฒนาโดยหน่วยนี้ การปฏิบัติได้พิสูจน์แล้วว่าวิธีนี้ง่ายกว่าและมีประสิทธิภาพมากกว่าวิธีการอัพโหลดไฟล์แบบเดิมๆ หลายวิธี