2009-05-08 13 views
5

È possibile caricare un file direttamente in una cartella di account ftp con ASP.NET?caricare su ftp asp.net

E.g. Clicco su browse, seleziono un file da caricare e quando clicco sul pulsante "upload", dovrebbe salvarlo direttamente nella cartella su un altro server web situato in un altro posto diverso dal server che viene utilizzato per caricare.

risposta

0

EDIT

Prima di tutto il segno @ è lì per bandiera la stringa come un letterale. ti evita di dover sfuggire a caratteri come i backslash. per esempio.

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

In secondo luogo, se hai solo FTP per l'altro server, allora si può prendere, la FileUpload.FileBytes proprietà del controllo FileUpload. Questo ti darà un byte[] del contenuto del file.

Da questo si utilizza System.Net.FtpWebRequest & System.Net.FtpWebResponse per caricare il file nell'account FTP.

Theres alcuni esempi di codice qui in VB.NET, ma dovrebbe essere abbastanza facile per voi per capire

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

ORIG controllo di caricamento

Il file vi fornirà il file sul tuo server web.

Spetterà a te, per copiare/salvare quel file, quindi dal server web a qualsiasi server su cui è ospitato l'FTP.

Si dispone di un percorso UNC/unità mappata condivisa sul tuo altro server che è possibile salvare in.

Il controllo FileUpload ha un metodo .SaveAs() quindi è solo una semplice questione di

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

grazie per la risposta .. Mi puoi dire ciò che il segno @ è usato per? e se posso usare un indirizzo IP piuttosto che un percorso fisico in quanto la pagina web si troverà su un server diverso dal server, caricherò i file in. ad es. fpt.mydomain.com/images e in tal caso, se è possibile farlo, probabilmente dovrò fornire le credenziali dell'utente giusto? se é cosi, come? –

+1

Il sito @ crea una stringa di vertabum, eliminando in pratica la necessità di eseguire l'escape \ as \\ –

+0

o ugualmente, anche;) –

0

Non puoi caricarlo su un server FTP direttamente dal modulo HTML. Tuttavia, è possibile caricarlo nell'applicazione ASP.NET e caricarlo sull'FTP da lì utilizzando FtpWebRequest.

4

Come ho capito la tua domanda, vuoi caricare il file su un altro server remoto (quindi non è un altro server seduto sulla stessa rete del tuo server web)? In tal caso puoi fare un paio di cose diverse. Il modo più semplice è forse per iniziare facendo un normale file si caricare il tuo server e quindi avere il vostro server di inviare il file tramite FTP per l'altro server remoto:

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); 
} 

... o potrebbe funzionare farlo in un passo:

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

(i din't provare questo codice fuori, quindi ci potrebbero essere alcuni errori in esso ...)

Aggiornamento: ho notato che mi sbagliavo nel ritenere che i metodi UploadXXX di WebClient erano statici ...

4

È possibile utilizzare la classe WebClient per archiviare il file caricato su FTP (senza salvarlo come file sul server). Qualcosa di simile a questo:

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

Questo sicuramente non funziona per la mia app Web ASP.NET. Mi chiedo perché questa sia una soluzione così popolare quando non riesco nemmeno a farlo funzionare. Così frustrante! >. < – Chiramisu

+0

@Chiramisu: Ci sono diversi possibili motivi per cui non funziona nel tuo caso, ma il metodo funziona nelle giuste circostanze. Si tratta solo di capire cosa gli impedisce di funzionare. – Guffa

+0

Sono sorpreso che tu abbia risposto a un thread così vecchio, ma grazie. Ho provato a caricare un file su FTP per giorni. Saresti così gentile da dare un'occhiata alla mia [domanda] (http://stackoverflow.com/questions/7744447/desperate-ftp-fileupload-wrong-client-path) sull'argomento? – 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; 
    }