C# ASP.NET przesyłanie pliku na zewnętrzny serwer FTP.

0

Mam zamiar przesłać plik załączony z kontrolki FileUpload na zewnętrzny serwer FTP
Aplikacja działa bez problemu jednak tylko lokalnie, po wrzuceniu na serwer wyrzuca błąd.
Próbowałem wszystkiego. Poniżej kod oraz komunikat błędu. Aplikacja na serwerze somee.com

 protected void Button6_Click(object sender, EventArgs e)
        {
            
           System.Net.WebClient webClient = new System.Net.WebClient();
           
           string webAddress = @"ftp://mojftpzewnetrzny.opx.pl/plik/";

           
           webClient.Credentials = new System.Net.NetworkCredential("[email protected]", "mojehaslo");
            
           

           string name = Path.GetFileName(FileUpload1.FileName);
           byte[] data = FileUpload1.FileBytes;
           webClient.UploadData(webAddress + name, data);

webClient.Dispose();

           string sciezka = "http://mojftpzewnetrzny.opx.pl/plik/" + FileUpload1.PostedFile.FileName;
            
           Label3.Text = sciezka;

        }

komunikat błędu:

Server Error in '/' Application.
The underlying connection was closed: The server committed a protocol violation.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:
[WebException: The underlying connection was closed: The server committed a protocol violation.]
System.Net.WebClient.UploadDataInternal(Uri address, String method, Byte[] data, WebRequest& request) +303
System.Net.WebClient.UploadData(Uri address, String method, Byte[] data) +152
System.Net.WebClient.UploadData(String address, Byte[] data) +34
zapis1.pliki.Button6_Click(Object sender, EventArgs e) in c:\Users\mcha\Documents\Visual Studio 2012\Projects\zapis1.1\zapis1\pliki.aspx.cs:93
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9628614
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +103
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724

Czy ktoś ma jakiś pomysł ?

0

Wywołujesz Dispose() na obiekcie WebClient chwile przed tym jak chcesz wysłać dane za jego pomocą.

0

Jestem przekonany że przyczyną błędu są poniższe linie.

 byte[] data = FileUpload1.FileBytes;
webClient.UploadData(webAddress + name, data);
Co robię źle ?
1

Może na tej stronie znajdziesz rozwiązanie:
http://piotrsulowski.pl/wysylanie-pliku-przez-ftp-csharp/

1

Wydaje mi się, że próbujesz wysyłać dane do serwera FTP, ale nie specyfikujesz jawnie protokołu (albo UploadData w ogóle nie jest obsługiwane dla FTP), dlatego używa HTTP, dlatego masz "protocol violation". Rozwiązanie podane przez @przemek_p używa FtpWebRequest, który przy okazji (o ile dobrze pamiętam) radzi sobie z ewentualnym użyciem trybu pasywnego, przy którym WebClient miał problemy.

Ale możesz jeszcze spróbować jawnie mu wyspecyfikować metodę STOR:

webClient.UploadFile(webAddress + "/" + new FileInfo(FileUpload1.FileName).Name, "STOR", FileUpload1.FileName);

A Dispose() nie powinieneś w ogóle używać jawnie, zrób raczej konstrukcję z using:

using (System.Net.WebClient webClient = new System.Net.WebClient())
{
    // wszystkie operacje na WebClient
}
// tutaj Dispose() zrobi się samo
0

Zrobiłem dokładnie tak jak w rozwiązaniu podanym przez przemek_p

Server Error in '/' Application.
Could not find file 'C:\obrazek1.jpg'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IO.FileNotFoundException: Could not find file 'C:\obrazek1.jpg'.

Podany plik istnieje na moim dysku. Ścieżkę podałem dokładnie tak jak w przykładzie. Ponownie lokalnie wszystko działa na serwerze się sypie.

czy podanie ścieżki lokalnej jako parametru

 FTP(@"c:\obrazek1.jpg", @"ftp://michalapp.opx.pl/plik/obrazek1.jpg", "mojLogin", "mojeHaslo");

nie wystarczy? Czy są potrzebne jakieś dodatkowe uprawnienia żeby odczytać plik z dysku ?

0

Tak to wygląda.


void FTP(string sciezkaLokalna, string sciezkaNaSerwerze, string login, string haslo)
        {
           FtpWebRequest ftp = (FtpWebRequest) WebRequest.Create(sciezkaNaSerwerze);
           ftp.Credentials = new NetworkCredential(login, haslo);
           ftp.KeepAlive = true;
           ftp.UseBinary = true;
           ftp.Method = WebRequestMethods.Ftp.UploadFile;
           FileStream fs = File.OpenRead(sciezkaLokalna);
           byte[] buffer = new byte[fs.Length];
           fs.Read(buffer, 0, buffer.Length);
           fs.Close();
           Stream ftpstream = ftp.GetRequestStream();
           ftpstream.Write(buffer, 0, buffer.Length);
           ftpstream.Close();

        }

       

             protected void Button6_Click(object sender, EventArgs e)
             {
                 FTP(@"c:\obrazek1.jpg", @"ftp://michalapp.opx.pl/plik/obrazek1.jpg", "[email protected]", "haslo");
             }
                 
 

Podany kod wygląda tak. Chciał bym domyślnie żeby plik był wczytywany z kontrolki FileUpload
Na tą chwilę podając ścieżkę już wywala błąd. Could not find file 'C:\obrazek1.jpg'.

0

By wybrać plik podczas działania programu w WPF należy skorzystaćz biblioteki:

using Microsoft.Win32; 

i zaktualizować kod:

        protected void Button6_Click(object sender, EventArgs e)
        {
            var ofd = new OpenFileDialog();
            ofd.ShowDialog();
            string path =ofd.FileName;
            FTP(path, @"ftp://...../plik/obrazek1.jpg", "nazwa", "haslo");
        } 
0

Nie mogę skorzystać z kontrolki FileUpload?

0

Sprawdziłem na testowym serwerze Webio. Wszystko działa. Czy to możliwe że protocol violation wynika z ograniczeń na darmowym serwerze somee.com ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1