บทนำ
บทความนี้อธิบายตัวอย่างออลอินกรอบที่พร้อมใช้งานสำหรับการดาวน์โหลด โค้ดตัวอย่างนี้สาธิตวิธีการอัปโหลด และดาวน์โหลดแฟ้มจากเซิร์ฟเวอร์ระยะไกล หรือภายในเครื่องใน ASP.NET คุณสามารถดาวน์โหลดแพคเกจตัวอย่างจากไอคอนดาวน์โหลดต่อไปนี้ ทั้ง C# และ Visual Basic .NET ภาษารุ่นแพคเกจตัวอย่างจะพร้อมใช้งาน
โค้ดตัวอย่างนี้สาธิตวิธีการอัปโหลด และดาวน์โหลดแฟ้มจากเซิร์ฟเวอร์ที่ไม่ได้อยู่ในขอบเขตของโดเมนการร้องขอของผู้ใช้ ฟังก์ชันการทำงานไว้ให้สำหรับการถ่ายโอนแฟ้มกับโพรโทคอล HTTP และ FTP นอกจากนี้ โค้ดตัวอย่างนี้ใช้ตัวระบุทรัพยากรเป็นรูปแบบ (URIs) เพื่อระบุตำแหน่งของแฟ้มบนเซิร์ฟเวอร์ คลาสที่คีย์ใช้ในโค้ดตัวอย่างนี้คือWebClientคลาสและคลาWebRequest
ระดับความยาก
ข้อมูลการดาวน์โหลด
เมื่อต้องการดาวน์โหลดโค้ดตัวอย่างนี้ คลิกการเชื่อมโยงต่อไปนี้:
ภาพรวมทางเทคนิค
ได้ค่อนข้างง่ายต่อการอัปโหลด และดาวน์โหลดแฟ้มจากเซิร์ฟเวอร์ระยะไกลใน ASP.NET ในไลบรารีคลาส.NET Framework ให้วัตถุขอเบาบางอย่าง คลาWebClientเป็นคลาระดับสูงที่ทำให้การโต้ตอบที่เซิร์ฟเวอร์ได้ง่ายขึ้น WebRequestวัตถุจะถูกใช้ โดยคลาWebClientการร้องขอให้ คลาสที่HttpWebRequestและFtpWebRequestถูกใช้งานโพรโทคอลเฉพาะของคลาWebRequestบทคัดย่อ HttpWebRequestประมวลผลวิธีการรับและลงรายการบัญชีของโพรโทคอล HTTP เพื่ออัปโหลด และดาวน์โหลดแฟ้ม FtpWebRequestประมวลผลวิธีการ STOR และเวลาทำซ้ำของโพรโทคอล FTP เพื่ออัปโหลด และดาวน์โหลดแฟ้ม
โค้ดตัวอย่างนี้ใช้วิธีการUploadDataและDownloadDataของคลาWebClientเพื่อโอนย้ายข้อมูลไปยัง และ จากเซิร์ฟเวอร์ระยะไกล URI วิธีการUploadDataถูกใช้กับวิธีการย้ายของโพรโทคอ HTTP และ "แอพลิเค ชัน/x-www-ฟอร์ม-urlencoded" อินเทอร์เน็ตชนิดสื่อ มีใช้วิธีDownloadDataด้วยวัตถุFileStreamเพื่อเก็บสตรีมข้อมูลขาเข้า และเขียนอาร์เรย์ของไบต์ไปยังแฟ้มภายในเครื่อง
ภาพรวมตัวอย่าง
ในตัวอย่างโค้ดนี้ คุณจะพบแฟ้ม RemoteFileForm.aspx ซึ่งอธิบายวิธีการใช้คลาสที่ใหม่สองแบบต่อไปนี้:
-
RemoteUpload
-
RemoteDownload
คลา RemoteUpload
คลาRemoteUploadมีลูกสองชั้น คลาสที่เหล่านี้คือHttpRemoteUploadและFtpRemoteUpload คลาสที่ทั้งสองใช้คอนสตรัคเตอร์ที่RemoteUpload คลาRemoteUploadต้องเป็นอาร์เรย์ของไบต์ของแฟ้มข้อมูลและเซิร์ฟเวอร์ URI คุณยังสามารถระบุชื่อที่จะใช้สำหรับแฟ้มอัปโหลด คลาFtpRemoteUploadใช้FtpWebRequestโดยตรง (แทนการใช้คลาWebClientสูงกว่า) เพื่อจัดการกับความต้องการเฉพาะของโพรโทคอล FTP
ดูคำนิยามของคลาสดังต่อไปนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคลาสRemoteUpload :
public class HttpRemoteUpload : RemoteUpload
{
public HttpRemoteUpload(byte[] fileData, string fileNamePath, string urlString)
: base(fileData, fileNamePath, urlString)
{
}
public override bool UploadFile()
{
byte[] postData;
try
{
postData = this.FileData;
using (WebClient client = new WebClient())
{
client.Credentials = CredentialCache.DefaultCredentials;
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
client.UploadData(this.UrlString, "PUT", postData);
}
return true;
}
catch (Exception ex)
{
throw new Exception("Failed to upload", ex.InnerException);
}
}
}
public class FtpRemoteUpload : RemoteUpload
{
public FtpRemoteUpload(byte[] fileData, string fileNamePath, string urlString)
: base(fileData, fileNamePath, urlString)
{
}
public override bool UploadFile()
{
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(this.UrlString);
reqFTP.KeepAlive = true;
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.UseBinary = true;
reqFTP.ContentLength = this.FileData.Length;
int buffLength = 2048;
byte[] buff = new byte[buffLength];
MemoryStream ms = new MemoryStream(this.FileData);
try
{
int contenctLength;
using (Stream strm = reqFTP.GetRequestStream())
{
contenctLength = ms.Read(buff, 0, buffLength);
while (contenctLength > 0)
{
strm.Write(buff, 0, contenctLength);
contenctLength = ms.Read(buff, 0, buffLength);
}
}
return true;
}
catch (Exception ex)
{
throw new Exception("Failed to upload", ex.InnerException);
}
}
} ในแฟ้ม RemoteFileForm.cs เมื่อคุณคลิกปุ่มอัปโหลดอินสแตนซ์ของวัตถุRemoteUploadถูกสร้างขึ้น ส่งผ่านเซิร์ฟเวอร์ URI และเส้นทางแฟ้มที่มีอยู่จริงภายในเครื่องเป็นพารามิเตอร์เพื่อสร้างวัตถุ
หมายเหตุ ถ้าคุณไม่ได้ระบุชื่อแฟ้มที่จะใช้เก็บแฟ้มบนเซิร์ฟเวอร์ ระบบจะสร้างชื่อแฟ้มตามวันปัจจุบันและเวลาบนเซิร์ฟเวอร์โดยอัตโนมัติ วันและเวลาเป็นมิลลิวินาทีพลาด# หลังจากเสร็จสิ้นการUploadDataวิธีการ ผลที่จะแสดงบนเพจปัจจุบัน
คลา RemoteDownload
คลาRemoteDownloadมีลูกสองชั้น คลาสที่เหล่านี้คือHttpRemoteDownloadและFtpRemoteDownload คลาRemoteDownloadจำเป็นต้องใช้ทรัพยากร URI และไดเรกทอรีทางกายภาพภายในเครื่อง คลาRemoteDownloadตรวจสอบเพื่อให้แน่ใจว่า ทรัพยากร URI ที่มีอยู่ก่อนการดาวน์โหลดจะเริ่มต้นใช้งาน คลาดึงกระแสข้อมูลที่ประกอบด้วยข้อมูลการตอบสนองจากเซิร์ฟเวอร์ และเขียนอาร์เรย์ของไบต์นี้เป็นFileStreamแล้ว คลาFtpRemoteDownloadใช้FtpWebRequestโดยตรง (แทนการใช้คลาWebClientสูงกว่า) เพื่อจัดการกับความต้องการเฉพาะของโพรโทคอล FTP
ดูคำนิยามของคลาสดังต่อไปนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคลาสRemoteDownload :
public class HttpRemoteDownload : RemoteDownload
{
public HttpRemoteDownload(string urlString, string descFilePath)
: base(urlString, descFilePath)
{
}
public override bool DownloadFile()
{
string fileName = System.IO.Path.GetFileName(this.UrlString);
string descFilePathAndName =
System.IO.Path.Combine(this.DescFilePath, fileName);
try
{
WebRequest myre = WebRequest.Create(this.UrlString);
}
catch
{
return false;
}
try
{
byte[] fileData;
using (WebClient client = new WebClient())
{
fileData = client.DownloadData(this.UrlString);
}
using (FileStream fs =
new FileStream(descFilePathAndName, FileMode.OpenOrCreate))
{
fs.Write(fileData, 0, fileData.Length);
}
return true;
}
catch (Exception ex)
{
throw new Exception("download field", ex.InnerException);
}
}
}
public class FtpRemoteDownload : RemoteDownload
{
public FtpRemoteDownload(string urlString, string descFilePath)
: base(urlString, descFilePath)
{
}
public override bool DownloadFile()
{
FtpWebRequest reqFTP;
string fileName = System.IO.Path.GetFileName(this.UrlString);
string descFilePathAndName =
System.IO.Path.Combine(this.DescFilePath, fileName);
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(this.UrlString);
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
using (FileStream outputStream = new FileStream(descFilePathAndName, FileMode.OpenOrCreate))
using (FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse())
using (Stream ftpStream = response.GetResponseStream())
{
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
}
return true;
}
catch (Exception ex)
{
throw new Exception("upload failed", ex.InnerException);
}
}
}
หมายเหตุ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการสร้าง และการจัดวางแอพลิเคชันตัวอย่าง ดู readme.txt ที่รวมอยู่ในแพคเกจดาวน์โหลด
ภาษา
ตัวอย่างรหัสนี้มีอยู่ในภาษาการเขียนโปรแกรมต่อไปนี้:
ภาษา |
ชื่อโครงการ |
---|---|
Visual C# |
CSRemoteUploadAndDownload |
Visual Basic.NET |
VRemoteUploadAndDownload |
ประเภทของเทคโนโลยี
-
ASP.NET 2.0
-
ASP.NET 3.5
-
ASP.NET 4.0
ข้อมูลอ้างอิง
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคลาWebClientแวะไปที่เว็บไซต์ Microsoft สำหรับนักพัฒนา (MSDN) ต่อไปนี้:
ข้อมูลทั่วไปเกี่ยวกับคลาส WebClientสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการUploadDataแวะไปเว็บไซต์ MSDN ต่อไปนี้:
ข้อมูลทั่วไปเกี่ยวกับวิธีการ UploadDataสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการDonwloadDataแวะไปเว็บไซต์ MSDN ต่อไปนี้:
ข้อมูลทั่วไปเกี่ยวกับวิธีการ DonwloadDataสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการFtpWebRequestแวะไปเว็บไซต์ MSDN ต่อไปนี้:
ข้อมูลทั่วไปเกี่ยวกับวิธีการ FtpWebRequestสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการอัปโหลด แฟ้มที่ มี FTP แวะไปที่เว็บไซต์ MSDN ต่อไปนี้:
ข้อมูลเพิ่มเติม
กรอบงานรหัสออลอินคืออะไร
กรอบงานรหัสออลอินแสดงเทคนิคการพัฒนา Microsoft ส่วนใหญ่ โดยใช้ตัวอย่างรหัสในภาษาการเขียนโปรแกรมต่าง ๆ ตัวอย่างแต่ละอย่างรอบคอบเลือก ส่วนประกอบ และจัดทำเอกสารเพื่อแสดงสถานการณ์สมมติรหัสทั่วไปหนึ่ง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับกรอบงานรหัสออลอิน แวะไปที่เว็บไซต์ของ Microsoft ต่อไปนี้:
วิธีการค้นหาตัวอย่างรหัส Framework ออลอินเพิ่มเติม
เมื่อต้องการค้นหาตัวอย่างรหัส Framework ออลอินเพิ่มเติม ค้นหา "kbcodefx" ร่วมกับคำสำคัญที่เกี่ยวข้องใน Microsoft สนับสนุนเว็บไซต์ หรือ แวะไปที่เว็บไซต์ของ Microsoft ต่อไปนี้:
คำปฏิเสธการเผยแพร่อย่างรวดเร็ว
Microsoft corporation และ/หรือของซัพพลายเออร์แต่ละรายทำไม่ได้ยืนยันใด ๆ เกี่ยวกับความเหมาะสม ความน่าเชื่อถือ หรือความถูกต้องของข้อมูลและกราฟิกที่เกี่ยวข้องที่มีอยู่ในที่นี้ ข้อมูลและกราฟิกที่เกี่ยวข้องทั้งหมดดังกล่าวไว้ให้ "ตามที่เป็นอยู่" โดยไม่มีการรับประกันใด ๆ Microsoft และ/หรือซัพพลายเออร์ที่เกี่ยวข้องแปลง disclaim รับประกันและเงื่อนไขที่เกี่ยวข้องกับข้อมูลนี้ทั้งหมด และที่เกี่ยวข้องกับกราฟิก รวมถึงการรับประกันโดยนัยทั้งหมดและเงื่อนไขของความสามารถในเชิงพาณิชย์ ความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ workmanlike ความพยายาม ชื่อเรื่อง และที่ไม่ใช่การละเมิด โดยเฉพาะอย่างยิ่งตกลงว่า ไม่ จะ Microsoft และ/หรือซัพพลายเออร์ที่รับผิดชอบใด ๆ เกิดจากทางตรง ทางอ้อม โทษ พิเศษ ต่อการเสียหาย หรือเสียหายใด ๆ ก็ตามรวมถึง แต่ไม่ เสียหายสำหรับการใช้ ข้อมูล หรือ กำไร เกิดจากทั้งหมด หรือ ในวิธีใด ๆ ที่เชื่อมโยงกับการใช้งานหรือไม่สามารถใช้ข้อมูลและกราฟิกที่เกี่ยวข้องอยู่ในที่นี้ ว่าตามสัญญา สูญ ความผิด หนี้สินที่เข้มงวด หรืออย่างอื่น ใด แม้ว่า Microsoft หรือของซัพพลายเออร์ใด ๆ มีการ คำแนะนำเกี่ยวกับเสียหายที่อาจเกิดขึ้น