การอัพโหลดและดาวน์โหลดไฟล์เป็นเทคโนโลยีที่เรามักจะต้องใช้ในกระบวนการพัฒนาโครงการจริง ต่อไปนี้เป็นวิธีการทั่วไปหลายวิธี:
1. วิธีแก้ปัญหาขีดจำกัดขนาดไฟล์อัพโหลด
2. บันทึกลงเซิร์ฟเวอร์เป็นไฟล์
3. แปลงเป็นสตรีมไบต์แบบไบนารีและบันทึกลงในฐานข้อมูลและวิธีการดาวน์โหลด
4. อัพโหลดทรัพยากรบนอินเทอร์เน็ต
ตอนที่ 1:
ก่อนอื่น เรามาพูดถึงวิธีแก้ปัญหาขีดจำกัดขนาดไฟล์ที่อัพโหลดใน ASP.NET กันดีกว่า เรารู้ว่าตามค่าเริ่มต้น ขีดจำกัดขนาดไฟล์ที่อัพโหลดของ ASP.NET คือ 2M โดยทั่วไปเราสามารถปรับแต่งได้โดยการเปลี่ยนเว็บ ไฟล์กำหนดค่า ขนาดไฟล์สูงสุดจะเป็นดังนี้:
<httpRuntimeExecutionTimeout="300" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"/>ด้วยวิธีนี้ ค่าสูงสุดของไฟล์ที่อัปโหลดจะกลายเป็น 4M แต่ไม่อนุญาตให้เราขยายค่าของ MaxRequestLength อย่างไม่สิ้นสุด เนื่องจาก ASP NET จะ หลังจากโหลดไฟล์ทั้งหมดลงในหน่วยความจำแล้ว ไฟล์เหล่านั้นจะถูกประมวลผล วิธีแก้ไขคือการใช้ HttpWorkerRequest โดยนัย และใช้วิธีการ GetPreloadedEntityBody และ ReadEntityBody เพื่ออ่านข้อมูลเป็นกลุ่มจากไปป์ที่สร้างโดย IIS สำหรับ ASP.NET วิธีการดำเนินการมีดังนี้:
IServiceProviderprovider=(IServiceProvider)HttpContext.Current;
HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
ไบต์ []bs=wr.GetPreloadedEntityBody();
-
ถ้า(!wr.IsEntireEntityBodyIsPreloaded())
-
intn=1024;
ไบต์ []bs2=ไบต์ใหม่[n];
ในขณะที่(wr.ReadEntityBody(bs2,n)>0)
-
-
-
}วิธีนี้จะช่วยแก้ปัญหาการอัปโหลดไฟล์ขนาดใหญ่
ส่วนที่ 2:
ต่อไปเราจะแนะนำวิธีการอัพโหลดไฟล์จากไคลเอนต์ไปยังเซิร์ฟเวอร์ในรูปแบบของไฟล์และส่งคืนข้อมูลพื้นฐานบางอย่างเกี่ยวกับไฟล์ที่อัพโหลด ขั้นแรก เราจะกำหนดคลาสเพื่อจัดเก็บข้อมูลเกี่ยวกับไฟล์ที่อัพโหลด (จำเป็นเมื่อส่งคืน) .
FileUpLoad คลาสสาธารณะ
-
FileUpLoad สาธารณะ ()
{
}
/***////// <สรุป>
/// อัพโหลดชื่อไฟล์
/// </สรุป>
ชื่อไฟล์สตริงสาธารณะ
-
รับ
-
ส่งคืนชื่อไฟล์;
-
ชุด
-
ชื่อไฟล์ = ค่า;
-
-
ชื่อไฟล์สตริงส่วนตัว;
/**////// <summary>
/// เส้นทางการอัปโหลดไฟล์
/// </สรุป>
FilePath สตริงสาธารณะ
-
รับ
-
เส้นทางไฟล์กลับ;
-
ชุด
-
ไฟล์พาธ = ค่า;
-
-
ไฟล์พาธสตริงส่วนตัว
/***////// <สรุป>
/// นามสกุลไฟล์
/// </สรุป>
FileExtension สตริงสาธารณะ
-
รับ
-
ส่งคืนไฟล์นามสกุล;
-
ชุด
-
fileExtension = ค่า;
-
-
นามสกุลไฟล์สตริงส่วนตัว;
-
นอกจากนี้ เรายังสามารถจำกัดรูปแบบของไฟล์ที่อัพโหลดในไฟล์กำหนดค่า (App.Config):
<?xml version="1.0" encoding="gb2312" ?>
<แอปพลิเคชัน>
<ไฟล์อัพโหลด>
<รูปแบบ>.jpg|.gif|.png|.bmp</รูปแบบ>
</FileUpLoad>
</ใบสมัคร>
ด้วยวิธีนี้เราสามารถเริ่มเขียนวิธีการอัพโหลดไฟล์ได้ดังนี้:
FileUpLoad สาธารณะ UpLoadFile (HtmlInputFile InputFile, string filePath, string myfileName, bool isRandom)
-
FileUpLoad fp = fileUpLoad ใหม่ ();
ชื่อไฟล์สตริง, fileExtension;
สตริง saveName;
-
//สร้างวัตถุอัพโหลด
-
HttpPostedFile โพสต์ไฟล์ = InputFile.PostedFile;
fileName = System.IO.Path.GetFileName(postedFile.FileName);
fileExtension = System.IO.Path.GetExtension (ชื่อไฟล์);
-
//กำหนดรูปแบบไฟล์ตามประเภท
-
แอป AppConfig = AppConfig ใหม่ ();
รูปแบบสตริง = app.GetPath("FileUpLoad/Format");
-
//หากรูปแบบไม่ตรงกัน ให้ส่งคืน
-
ถ้า(format.IndexOf(fileExtension)==-1)
-
โยน ApplicationException ใหม่ ("รูปแบบข้อมูลที่อัพโหลดไม่ถูกต้อง");
-
-
//สร้างชื่อไฟล์แบบสุ่มตามวันที่และตัวเลขสุ่ม
-
ถ้า (myfileName != string.Empty)
-
ชื่อไฟล์ = myfileName;
}
ถ้า (เป็นแบบสุ่ม)
-
สุ่ม objRand = สุ่มใหม่ ();
วันที่ System.DateTime = DateTime.Now;
//สร้างชื่อไฟล์แบบสุ่ม
saveName = date.Year.ToString() + date.Month.ToString() + date.Day.ToString() + date.Hour.ToString() + date.Minute.ToString()
+ date.Second.ToString() + Convert.ToString(objRand.Next(99)*97 + 100);
fileName = saveName + นามสกุลไฟล์;
-
สตริง phyPath = HttpContext.Current.Request.MapPath (filePath);
//ตรวจสอบว่ามีเส้นทางอยู่หรือไม่ ถ้าไม่มี ให้สร้างเส้นทางขึ้นมา
DirectoryInfo upDir = DirectoryInfo ใหม่ (phyPath);
ถ้า(!upDir.มีอยู่)
-
upDir.สร้าง();
}
//
//บันทึกไฟล์
-
พยายาม
-
postFile.SaveAs(phyPath + ชื่อไฟล์);
fp.FilePath = filePath + ชื่อไฟล์;
fp.FileExtension = นามสกุลไฟล์;
fp.FileName = ชื่อไฟล์;
-
จับ
-
โยน ApplicationException ใหม่ ("การอัปโหลดล้มเหลว!");
-
//ส่งคืนข้อมูลของไฟล์ที่อัพโหลด
กลับ fp;
-
จากนั้นเราก็สามารถเรียกเมธอดนี้เมื่อทำการอัพโหลดไฟล์และบันทึกข้อมูลไฟล์ที่ส่งคืนลงฐานข้อมูลได้
ส่วนที่สาม:
ที่นี่เราพูดถึงวิธีการอัปโหลดและดาวน์โหลดไฟล์ในรูปแบบไบนารีเป็นหลัก ก่อนอื่นเรามาพูดถึงการอัปโหลดวิธีการดังต่อไปนี้:
ไบต์สาธารณะ [] UpLoadFile (HtmlInputFile f_IFile)
-
//เข้าถึงไฟล์ที่อัพโหลดที่ระบุโดยไคลเอนต์
HttpPostedFile upFile=f_IFile.PostedFile;
//รับความยาวของไฟล์ที่อัพโหลด
int upFileLength=upFile.ContentLength;
//รับประเภท MIME ของไคลเอ็นต์ของไฟล์ที่อัปโหลด
สตริง contentType = upFile.ContentType;
ไบต์ [] FileArray = ไบต์ใหม่ [upFileLength];
สตรีม fileStream=upFile.InputStream;
fileStream.Read(FileArray,0,upFileLength);
}เมธอดนี้ส่งคืนสตรีมไบต์แบบไบนารีของไฟล์ที่อัปโหลด เพื่อให้เราสามารถบันทึกลงในฐานข้อมูลได้ เรามาพูดถึงรูปแบบการดาวน์โหลดนี้กัน คุณอาจคิดว่าการดาวน์โหลดด้วยวิธีนี้คือการสร้างเพจ aspx ใหม่ จากนั้นจึงนำสตรีมไบต์ไบนารี่ออกมาในเหตุการณ์ Page_Load() แล้วอ่านออกมา จริงๆ แล้ววิธีนี้ ไม่แนะนำ ในการใช้งานจริงอาจมีข้อผิดพลาดที่ไม่สามารถเปิดบางเว็บไซต์ได้
ขั้นแรกให้เพิ่ม: ไปที่ Web.config:
<เพิ่มกริยา = "*" path = "openfile.aspx" type = "RuixinOA.Web.BaseClass.OpenFile, RuixinOA.Web"/>
ซึ่งหมายความว่าเมื่อฉันเปิดเพจ openfile.aspx ระบบจะดำเนินการวิธีการในคลาส RuixinOA.Web.BaseClass.OpenFile โดยอัตโนมัติ การใช้งานเฉพาะมีดังนี้:
ใช้ระบบ;
ใช้ System.Data;
ใช้ System.Web;
ใช้ System.IO;
ใช้ Ruixin.WorkFlowDB;
โดยใช้RXSuite.Base;
การใช้RXSuite.Component;
ใช้ RuixinOA.BusinessFacade;
เนมสเปซ RuixinOA.Web.BaseClass
-
/***////// <สรุป>
/// คำอธิบายโดยย่อของ NetUFile
/// </สรุป>
OpenFile คลาสสาธารณะ: IHttpHandler
-
ProcessRequest โมฆะสาธารณะ (บริบท HttpContext)
-
//รับข้อมูลไฟล์ที่จะดาวน์โหลดจากฐานข้อมูล
RuixinOA.BusinessFacade.RX_OA_FileManager ระบบปฏิบัติการ = RX_OA_FileManager ใหม่ ();
ข้อมูล EntityData = os.GetFileDetail(id);
if(data != null && data.Tables["RX_OA_File"].Rows.Count > 0)
-
DataRow dr = (DataRow)data.Tables["RX_OA_File"].Rows[0];
context.Response.Buffer = จริง;
บริบทการตอบสนอง.Clear();
context.Response.ContentType = dr["CContentType"].ToString();
context.Response.AddHeader("การจัดการเนื้อหา", "ไฟล์แนบ; filename =" + HttpUtility.UrlEncode (dr ["CTitle"].ToString()));
context.Response.BinaryWrite((ไบต์[])dr["CContent"]);
บริบทการตอบสนองฟลัช ();
บริบทการตอบสนองสิ้นสุด ();
-
}
บูลสาธารณะ IsReusable
{
รับ { ส่งคืนจริง;}
-
-
}
หลังจากดำเนินการตามวิธีการข้างต้น ระบบจะแจ้งให้ผู้ใช้เลือกเปิดโดยตรงหรือดาวน์โหลด แค่นั้นแหละสำหรับส่วนนี้
ส่วนที่ 4:
ส่วนนี้พูดถึงวิธีการอัปโหลดทรัพยากรบนอินเทอร์เน็ตไปยังเซิร์ฟเวอร์เป็นหลัก เรามีบทความก่อนหน้านี้ซึ่งมีรายละเอียดวิธีใช้งาน ดังนั้นฉันจะไม่พูดเพิ่มเติมที่นี่
โปรดอ้างอิงถึง: แปลงไดนามิกเพจให้เป็นสตรีมไบต์ไบนารี
ตอนที่ 5: สรุป
วันนี้ผมจะมาแนะนำวิธีการอัพโหลดและดาวน์โหลดไฟล์ต่างๆ สั้นๆ ซึ่งมักใช้ในการพัฒนาโครงการจริง ผมหวังว่าทุกคนจะสามารถแลกเปลี่ยนประสบการณ์ในการพัฒนาโครงการได้ โปรดแก้ไขฉันถ้าฉันเขียนไม่ดี ขอบคุณ!
อีเมล์:[email protected]