Hur att överföra och hämta filer från en fjärrserver i ASP.NET

Introduktion

I artikeln beskrivs ett ramverk för allt-i-ett prov som är tillgänglig för hämtning. Detta kodexempel visar hur att överföra och hämta filer från en fjärrdator eller en lokal server i ASP.NET. Du kan hämta exempel paket från följande ikoner för hämtning. Både C# och Visual Basic .NET språkversioner av prov-paket finns tillgängliga.


Detta kodexempel visar hur att överföra och hämta filer från en server som inte omfattas av användarens begäran domän. Funktioner finns för att överföra filer med HTTP- och FTP-protokollen. Detta kodexempel används också Uniform Resource Identifier (URI) för att identifiera placeringen av filer på en server. Viktiga klasser som används i det här kodexemplet är klassen WebClient och klassen WebRequest .

Svårighetsgrad




alternate text

Information om hämtning

Klicka på någon av följande länkar om du vill hämta detta kodexempel:

Teknisk översikt

Det är ganska enkelt att överföra och hämta filer från en fjärrserver i ASP.NET. Klassbiblioteket i.NET Framework ger vissa lätta begäran objekt. WebClient -klassen är en hög klass som underlättar server interaktioner. WebRequest objekt används av WebClient -klassen så att begäranden. I HttpWebRequest - och FtpWebRequest -klasserna är protocol-specifika implementeringar av abstrakt klass WebRequest . I HttpWebRequest implementerar metoderna GET och POST av HTTP-protokollet för att överföra och hämta filer. FtpWebRequest implementerar metoderna STOR och RETR av FTP-protokollet för att överföra och hämta filer.


Detta kodexempel används metoderna UploadData och DownloadData i klassen WebClient för att överföra data till och från en fjärrserver URI. UploadData -metoden används med PUT-metoden HTTP-protokollet och Skriv ”application/x-www-formuläret-urlencoded” Internetmedia. Metoden DownloadData används med FileStream -objekt för att lagra inkommande dataströmmen och skriva byte-array till en lokal fil.

Exempel: översikt

I denna exempelkod finns filen RemoteFileForm.aspx som förklarar hur du använder följande två nya klasser:

  • RemoteUpload

  • RemoteDownload

RemoteUpload-klass

RemoteUpload -klassen har två underordnade klasser. Dessa klasser är HttpRemoteUpload och FtpRemoteUpload. Båda klasserna använda konstruktorn RemoteUpload . Klassen RemoteUpload kräver en byte-array av fildata och serverns URI. Du kan också ange ett namn för den överförda filen. Klassen FtpRemoteUpload används FtpWebRequest direkt (i stället för med hjälp av klassen överordnad WebClient ) att hantera särskilda krav på FTP-protokollet.


Se följande klassdefinitioner för mer information om klassen 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);
}
}

} När du klickar på Skicka -knappen i RemoteFileForm.cs-filen skapas en instans av objektet RemoteUpload . Skicka serverns URI och lokala fysiska sökväg som parametrar för att skapa objektet.


Obs! Om du inte anger ett filnamn som du använder för att lagra filen på servern, kommer systemet automatiskt att generera ett filnamn efter aktuellt datum och tid på servern. Datum och tid stämmer till vilken millisekund. När metoden UploadData har slutförts visas resultatet på den aktuella sidan.

RemoteDownload-klass

RemoteDownload -klassen har också två underordnade klasser. Dessa klasser är HttpRemoteDownload och FtpRemoteDownload. Klassen RemoteDownload kräver en URI-resurs och en lokal, fysisk katalog. Klassen RemoteDownload kontrolleras för att säkerställa att URI-resurs finns innan hämtningen påbörjas. Klassen hämtar strömmen som innehåller svarsdata från servern och sedan skriver byte-array till en FileStream. Klassen FtpRemoteDownload används FtpWebRequest direkt (i stället för med hjälp av klassen överordnad WebClient ) att hantera särskilda krav på FTP-protokollet.


Se följande klassdefinitioner för mer information om klassen 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);
}
}
}
Obs! Mer information om hur du skapar och distribuerar exempelprogrammet finns i filen Readme.txt, som ingår i paketet.


Språk

Detta kodexempel är tillgänglig i följande programmeringsspråk:

Språk

Namn på projekt

Visual C#

CSRemoteUploadAndDownload

Visual Basic.NET

VRemoteUploadAndDownload

Kategori teknik

  • ASP.NET 2.0

  • ASP.NET 3.5

  • ASP.NET 4.0

Referenser

Mer information om klassen WebClient finns på följande Microsoft Developer (MSDN)-webbplats:

Allmän information om klassen WebClientMer information om metoden UploadData finns på följande MSDN-webbplats:

Allmän information om metoden UploadDataMer information om metoden DonwloadData finns på följande MSDN-webbplats:

Allmän information om metoden DonwloadDataMer information om metoden FtpWebRequest finns på följande MSDN-webbplats:

Allmän information om metoden FtpWebRequestMer information om hur du överför filer med FTP finns på följande MSDN-webbplats:

Hur du överför filer med FTP

Mer Information

Vad är en allt-i-ett ramverk för kod?

Allt-i-ett ramverk för kod visar utvecklingstekniker för de flesta Microsoft med hjälp av kodexemplen i olika programmeringsspråk. Varje exempel är noggrant valt består och dokumenterats om du vill visa ett vanligt scenario för koden. Mer information om allt-i-ett ramverk för kod finns på följande Microsoft-webbplats:

http://1code.codeplex.com

Hur du hittar fler allt-i-ett ramverk för kod prover

Om du vill hitta mer allt-i-ett ramverk för kod prover, Sök efter ”kbcodefx” tillsammans med relaterade nyckelord på Microsofts webbplats för support. Eller besök följande Microsoft-webbplats:

Allt-i-ett ramverk för kod prover

Ansvarsfriskrivning för snabb publicering

Microsoft corporation och/eller dess respektive leverantörer gör inga utsagor om lämpligheten, tillförlitlighet eller riktigheten av den information och relaterad grafik som finns häri. Sådan information och relaterad grafik tillhandahålls ”i befintligt skick” utan några garantier. Microsoft eller dess respektive leverantörer frånsäger sig alla garantier och villkor med hänsyn till denna information härmed och relaterad grafik, inklusive alla underförstådda garantier och villkor för säljbarhet, lämplighet för ett särskilt ändamål, workmanlike insats, titel och icke-intrång. Du samtycker uttryckligen att under inga omständigheter skall Microsoft eller dess leverantörer vara ansvariga för några direkta, indirekta, följdskador, oförutsedda skador, speciella, därav följande skador eller skador inklusive, utan begränsning, skadestånd för förlust av användning, data eller vinst, som uppstår ur eller på något sätt i samband med användning av eller oförmåga att använda information och relaterad grafik som finns häri, vare sig baserat på kontrakt, skadeståndsansvar, försummelse, strikt ansvar eller på annat sätt, även om Microsoft eller någon av dess leverantörer har informerats om risken för skador.

Behöver du mer hjälp?

Utöka dina kunskaper
Utforska utbildning
Få nya funktioner först
Anslut till Microsoft Insiders

Hade du nytta av den här informationen?

Hur nöjd är du med översättningskvaliteten?

Vad påverkade din upplevelse?

Har du ytterligare feedback? (Valfritt)

Tack för din feedback!

×