2009-05-08 6 views
5

Ist es möglich, eine Datei direkt in einen FTP-Account-Ordner mit ASP.NET hochzuladen?Upload zu ftp asp.net

z. Ich klicke auf Durchsuchen, wähle eine Datei zum Hochladen und wenn ich auf "Upload" klicke, sollte sie direkt in den Ordner auf einem anderen Webserver gespeichert werden, der sich an einem anderen Ort als dem Server befindet, der zum Hochladen verwendet wird.

Antwort

0

EDIT

Zunächst einmal das @ Zeichen gibt es die Zeichenfolge als wörtliche Flagge. Es erspart Ihnen, Zeichen wie Backslashes zu entkommen. z.B.

string path = "Z:\\Path\\To\\File.txt"; 
string path = @"Z:\Path\To\File.txt"; 

Zweitens, wenn Sie nur FTP-Zugriff auf den anderen Server haben, nehmen Sie dann das FileUpload.FileBytes Eigentum des Fileupload-Steuerelement. Das gibt Ihnen einen byte[] des Dateiinhalts.

Von diesem verwenden Sie die System.Net.FtpWebRequest & System.Net.FtpWebResponse, um Ihre Datei auf den FTP-Account hochzuladen.

Theres einig Beispiel-Code hier in VB.NET, aber es sollte einfach genug für Sie

http://www.programmingforums.org/thread15954.html

ORIG

Die Datei-Upload-Steuerelement, das Sie mit der Datei zur verfügung, um herauszufinden, auf deinem Webserver.

Es wäre Ihnen überlassen, diese Datei dann vom Webserver auf den Server zu kopieren/speichern, auf dem FTP gehostet wird.

Haben Sie ein UNC-Pfad/zugeordnetes Laufwerk auf Ihrem anderen Server, auf dem Sie speichern können?

Das Fileupload-Steuerelement hat eine .SaveAs() Methode so ist es nur eine einfache Sache der

if (FileUpload1.HasFile) 
try 
{ 
    FileUpload1.SaveAs(@"Z:\Path\On\Other\Server\" + FileUpload1.FileName); 
} 
+0

danke für die Antwort .. Können Sie mir sagen, was das @ -Zeichen für verwendet? und wenn ich eine IP-Adresse anstelle eines physikalischen Pfades verwenden kann, da sich die Webseite auf einem anderen Server befindet als der Server, auf den ich die Dateien hochladen werde, z. fpt.mydomain.com/images und in diesem Fall, wenn dies möglich ist, werde ich wahrscheinlich Benutzer Anmeldeinformationen richtig? Wenn das so ist, wie? –

+1

Die @ Site erstellt eine Vertabum-Zeichenfolge, wodurch die Notwendigkeit der Escape-Funktion entfernt wird. \ As \\ –

+0

Oder wörtlich, even;) –

0

Sie es direkt von Ihrem HTML-Formular an einen FTP nicht hochladen können. Sie können es jedoch in Ihre ASP.NET-Anwendung hochladen und von dort aus mit FtpWebRequest auf den FTP-Server hochladen.

4

Wie ich Ihre Frage verstehe, möchten Sie die Datei auf einen anderen Remote-Server hochladen (es ist also kein anderer Server im selben Netzwerk wie Ihr Webserver). In diesem Fall können Sie ein paar verschiedene Dinge tun. Der einfachste Weg ist vielleicht, indem sie eine reguläre Datei laden Sie Ihren Server zu starten, und dann haben Sie Ihre Server die Datei per FTP auf den anderen Remote-Server senden:

string fileName = Path.Combine("<path on your server", FileUpload1.FileName); 
FileUpload1.SaveAs(fileName); 
using(System.Net.WebClient webClient = new System.Net.WebClient()) 
{ 
    webClient.UploadFile(
     New Uri("ftp://remoteserver/remotepath/" + FileUpload1.FileName), 
     localFile); 
} 

... oder es könnte es zu tun arbeiten in ein Schritt:

using(System.Net.WebClient webClient = new System.Net.WebClient()) 
{ 
    webClient.UploadData(
     New Uri("ftp://remoteserver/remotepath/" + FileUpload1.FileName), 
     FileUpload1.FileBytes); 
} 

(din't ich aus diesem Code versuchen, so gibt es einige Fehler drin sein könnte ...)

Update: ich bemerkte, dass ich in der Annahme falsch war, dass die UploadXXX Methoden von WebClient waren statisch ...

4

Sie können die Klasse WebClient verwenden, um die hochgeladene Datei auf FTP zu speichern (ohne sie als Datei auf dem Server zu speichern). Etwas wie folgt aus:

string name = Path.GetFileName(UploadControl.FileName); 
byte[] data = UploadControl.FileBytes; 

using (WebClient client = new WebClient()) { 
    client.UploadData("ftp://my.ftp.server.com/myfolder/" + name, data); 
} 
+0

Dies funktioniert definitiv nicht für meine ASP.NET-Webanwendung. Ich frage mich, warum das eine so beliebte Lösung ist, wenn ich es nicht einmal zur Arbeit bringen kann. So frustrierend! >. < – Chiramisu

+0

@Chiramisu: Es gibt mehrere mögliche Gründe, warum es in Ihrem Fall nicht funktioniert, aber die Methode funktioniert unter den richtigen Umständen. Es geht nur darum, herauszufinden, was es daran hindert, zu arbeiten. – Guffa

+0

Ich bin überrascht, dass du auf so einen alten Thread geantwortet hast, aber danke. Ich habe seit Tagen versucht, eine Datei erfolgreich auf FTP hochzuladen. Würdest du so freundlich sein, einen Blick auf meine [Frage] (http://stackoverflow.com/questions/7744447/desperate-ftp-fileupload-wrong-client-path) zu werfen? – Chiramisu

4
/// <summary> 
    /// Example call : if (FtpUpload(FileUploadControl1, "ftp.my.com/somePathDir", @"user", "pass!", "domain")) 
    /// </summary> 
    /// <param name="file"></param> 
    /// <param name="ftpServer"></param> 
    /// <param name="username"></param> 
    /// <param name="ftpPass"></param> 
    /// <returns></returns> 
    private bool FtpUpload(FileUpload file, string ftpServer, string username, string ftpPass, string domainName = "") 
    { 
     // ftp://domain\user:[email protected]/url-path 
     // If you are a member of a domain, then "ftp://domain-name\username:[email protected]" may fail because the backslash (\) is sent in as a literal character and Internet Explorer incorrectly looks for a file instead of parsing a Web address. Changing the backslash (\) in the domain-name\username to domainname%5Cusername works correctly. 

     try 
     { 
      string ftpAddres; 
      if (domainName != string.Empty) 
       ftpAddres = "ftp://" + domainName + @"%5C" + username + ":" + ftpPass + "@" + ftpServer + "/" + file.FileName; 
      else 
       ftpAddres = "ftp://" + username + ":" + ftpPass + "@" + ftpServer + "/" + file.FileName; 

      using (var webClient = new System.Net.WebClient()) 
      { 
       webClient.UploadData(new Uri(ftpAddres), file.FileBytes); 
      } 

     } 
     catch (Exception e) 
     { 
      throw new Exception(e.Message, e); 
     } 
     return true; 
    }