FtpWebRequest returnează eroarea 550 Fișier indisponibil (Programare, C#,.Net, Încărcare Fișiere, Ftp, Ftpwebrequest)

chosenOne Thabs a intrebat.

Am creat o mică aplicație windows forms pentru a încărca fișierul pe site-ul ftp al unui client al nostru. Dar problema cu care mă confrunt este că atunci când execut această aplicație pe mașina mea locală, ea încarcă fișierul cu succes. Dar dacă execut acest program pe serverul nostru, primesc acest mesaj de eroare;

serverul la distanță a returnat o eroare: (550) Fișier indisponibil (de exemplu, nu se găsește fișierul, nu se poate accesa fișierul), pe această linie „objFTPRequest.GetRequestStream();”.

Știe cineva de ce? Trebuie să configurez firewall-ul sau ceva de genul acesta? Iată codul meu;

FileInfo objFile = new FileInfo(filename);
FtpWebRequest objFTPRequest;

// Create FtpWebRequest object 
objFTPRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/outbox/" + objFile.Name));

// Set Credintials
objFTPRequest.Credentials = new NetworkCredential(ftpUserName, ftpPassword);

// By default KeepAlive is true, where the control connection is 
// not closed after a command is executed.
objFTPRequest.KeepAlive = false;

// Set the data transfer type.
objFTPRequest.UseBinary = true;

// Set content length
objFTPRequest.ContentLength = objFile.Length;

// Set request method
objFTPRequest.Method = WebRequestMethods.Ftp.UploadFile;

// Set buffer size
int intBufferLength = 16 * 1024;
byte[] objBuffer = new byte[intBufferLength];

// Opens a file to read
FileStream objFileStream = objFile.OpenRead();


// Get Stream of the file
Stream objStream = objFTPRequest.GetRequestStream();

int len = 0;

while ((len = objFileStream.Read(objBuffer, 0, intBufferLength)) != 0)
{
    // Write file Content 
    objStream.Write(objBuffer, 0, len);

}

            objStream.Close();
            objFileStream.Close();

15 răspunsuri
Microsoft DN

Această eroare poate fi cauzată din mai multe motive, cum ar fi faptul că fișierul nu este prezent pe server, permisiuni de securitate pe fișier etc. etc.

Mai întâi trebuie să aflați cauza exactă a erorii. acest lucru poate fi realizat folosind următorul cod-

try
{
        //Your code
}
catch(WebException e)
{
        String status = ((FtpWebResponse)e.Response).StatusDescription;
}

Odată ce ați aflat cauza exactă a erorii, puteți merge mai departe pentru a o rezolva.

Iată câteva link-uri la care vă puteți referi

http://forums.asp.net/t/1777881.aspx/1

http://nickstips.wordpress.com/2010/10/25/c-ftp-upload-error-the-remote-server-returned-an-error-550-file-unavailable-e-g-file-not-found-no-access/

http://www.dreamincode.net/forums/topic/76361-file-upload-to-server/

http://forums.asp.net/t/1374306.aspx/1

Comentarii

  • Bună din nou. Mulțumesc. Mesajul de eroare actual este 550 Acces refuzat. Am acordat folderului meu permisiunea completă, cu excepția „permisiunii speciale”. Există o altă cauză posibilă în afară de „permisiune specială”? –  > Por alesOne Thabs.
  • Bună, băieți. Nu am câștigat. Am decis să găzduiesc această aplicație pe o altă mașină. Funcționează bine. Mulțumesc. –  > Por alesOne Thabs.
  • Această eroare poate apărea dacă nu aveți suficiente permisiuni sau dacă directorul din cerere nu este prezent. cum ar fi fișierele din xxx.xxx.xxx.xxx.xxx/files –  > Por Mahdi Rostami.
  • Ce sfat util, eu prindeam doar evenimentul „Exception”, acum pot vedea clar ce reprezintă eroarea! Mulțumesc.  > Por Bruno Willian.
Bremaria

Încercați acest lucru:ftp://xxx.xxx.xx.xx:21//path/filename

„//” de după adresa serverului vă pornește de la directorul rădăcină. Chiar dacă am avut:ftp://xxx.xxx.xx.xx:21/path/filenamenu m-a dus la directorul corect.

Comentarii

  • Acest lucru este atât de oribil, dar chiar a funcționat pentru mine – sunt îngrozit și presupun că ar trebui să fie un bug, dar mulțumesc. –  > Por ocramot.
  • Uimitor! Asta chiar a rezolvat problema. Mulțumesc lui Dumnezeu că ai scris asta. N-aș fi ghicit nici într-un milion de ani. –  > Por Robert4Real.
  • De asemenea, am întâlnit problema. Un sfat grozav, nu aș fi încercat niciodată asta. –  > Por Matthias Loerke.
  • Trebuie să fie o eroare în executabilul MS FTP. Am văzut eșecuri consistente și aleatorii ale căilor de fișiere mai lungi care se împing către un punct final FTP IIS. Cele de mai sus le-au rezolvat. –  > Por Matt.
francis

Am întâlnit aceeași problemă și iată ce am făcut:

  1. Verificați dacă sistemul de operare are dreptul de a scrie. Găsiți folderul ftp =>click dreapta=>properties=>security, apoi trebuie să știți ce trebuie să faceți
  2. Verificați dacă serverul ftp a deschis dreptul de scriere pentru utilizatorul pe care l-ați logat. Deschideți IIS=>faceți clic pe site-ul ftp=>Reguli de autorizare ftp=>adăugați reguli de permisiune=>alegeți un utilizator sau un grup pentru a seta drepturile
  3. Verificați dir-ul de pe serverul ftp, faceți același lucru la punctul 2.

Pot folosi patru imagini pentru a arăta drepturile care trebuie setate:

Comentarii

  • Bună, Francis. Voi încerca sugestia ta. Vă voi anunța imediat ce voi reuși. Mulțumesc.  > Por alesOne Thabs.
  • Nu uitați să setați permisiunile pe folderele copil. Puteți seta permisiunile pe folderul cel mai de sus și moșteni aceste permisiuni în jos la folderele copil prin: mergeți la folderul ftp de nivel superior =>click dreapta=>properties=>security => advanced => pick a user => change permissions => edit permissions (după cum este necesar) ȘI „includeți permisiunile moștenite de la părintele obiectului” – -.  > Por robor.
makemoney2010

Ar putea fi mai simplu.

Mă confrunt cu o problemă similară și am încercat toate soluțiile sugerate, dar nimeni nu funcționează. îmi dau seama într-o manieră simplă ca aceasta: aruncați o privire

Cod greșit la sfârșitul meu

 Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files"), FtpWebRequest)

Schimbați-l în acest simplu :

 Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files/youfilename.ext"), FtpWebRequest)

apoi procced cu cererea de umplere și trimite la server 🙂

Asta e tot.

Asigurați-vă că toate permisiunile de pe server funcționează bine și că folosiți acreditările corecte.

Comentarii

  • Bine reperat! Am avut și eu această problemă și am aruncat o privire la link-urile furnizate aici, dar nu m-au ajutat. Oricum, motivul comentariului este pentru că documentația oficială Microsoft este incorectă. Am urmat acest exemplu: msdn.microsoft.com/en-us/library/ms229715(v=vs.110).aspx Adresa de solicitare este sufixată cu extensia „.htm” și este încărcat un fișier text. Am crezut mai degrabă că pagina este o eroare decât tipul de extensie. Atenție la oricine altcineva care urmează exemplul Microsoft de mai sus! Cu respect, Matt –  > Por Matthew Blott.
sham

Am găsit soluția. Problema este directorul de lucru curent al utilizatorului ftp. Dacă tastați o adresă url de genul ftp:///path/test.txt, aceasta este folosită ca o cale relativă către directorul de lucru. De exemplu, CWD este /test, atunci calea utilizată este /test/path/test.txt. Dacă doriți să folosiți o cale absolută, trebuie să introduceți o adresă URL de tipul ftp:////path/test.txt. Apoi, fișierul este încărcat în folderul /path/test.txt, fără excepție.

Martin Prikryl

De obicei, serverul returnează un mesaj de eroare relevant cu 550 cod. Dar implementarea FTP din cadrul .NET traduce toate codurile de stare FTP în propriul mesaj (localizat). În special codul 550 este tradus în „Fișier indisponibil”. Acest lucru, în multe cazuri, ascunde adevărata problemă.

Activați jurnalizarea .NET pentru a vedea adevăratul mesaj de eroare de la server:
Jurnal de ieșire utilizând FtpWebRequest


Iată câteva scenarii diferite și comune care duc la eroarea 550:

  • FtpWebRequest care returnează „550 File unavailable (de exemplu, fișierul nu este găsit, nu există acces)” atunci când se utilizează ListDirectoryDetails pentru un director care există.
  • Serverul la distanță a returnat o eroare: (550) la încărcarea unui fișier pe FTP utilizând FtpWebRequest

Taras Kravets

Pentru a rezolva această problemă, este necesar să forțăm comanda System.Net.FtpWebRequest să revină la vechiul comportament de funcționare din .Net Framework 2.0/3.5 și să emită comanda CWD suplimentară înainte de a emite comanda propriu-zisă.

Pentru a face acest lucru, următorul cod trebuie să fie plasat înainte de a fi invocată orice instanță a clasei System.Net.FtpWebRequest. Codul de mai jos trebuie să fie apelat o singură dată, deoarece modifică setările întregului domeniu de aplicație.

private static void SetMethodRequiresCWD()
{
        Type requestType = typeof(FtpWebRequest);
        FieldInfo methodInfoField = requestType.GetField("m_MethodInfo", BindingFlags.NonPublic | BindingFlags.Instance);
        Type methodInfoType = methodInfoField.FieldType;


        FieldInfo knownMethodsField = methodInfoType.GetField("KnownMethodInfo", BindingFlags.Static | BindingFlags.NonPublic);
        Array knownMethodsArray = (Array)knownMethodsField.GetValue(null);

        FieldInfo flagsField = methodInfoType.GetField("Flags", BindingFlags.NonPublic | BindingFlags.Instance);

        int MustChangeWorkingDirectoryToPath = 0x100;
        foreach (object knownMethod in knownMethodsArray)
        {
            int flags = (int)flagsField.GetValue(knownMethod);
            flags |= MustChangeWorkingDirectoryToPath;
            flagsField.SetValue(knownMethod, flags);
        }
 }

http://support.microsoft.com/kb/2134299

Jan Macháček

Asigurați-vă că dosarul țintă „outbox” există. aceasta a fost problema mea cu eroarea 550.

Pur și simplu creați directorul țintă „ieșire” înainte de încărcare.

try
        {
            WebRequest request = WebRequest.Create("ftp://" + ftpServerIP + "/outbox");
            request.Credentials = new NetworkCredential("user", "password");
            request.Method = WebRequestMethods.Ftp.MakeDirectory;
            using (var resp = (FtpWebResponse)request.GetResponse())
            {
                Console.WriteLine(resp.StatusCode);
            }
        }
        catch (WebException ex)
        {
            FtpWebResponse response = (FtpWebResponse)ex.Response;
            if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
            {
                response.Close();
                //already exists
            }
            else
            {
                response.Close();
                //doesn't exists = it's another exception
            }
        }

BingoCoder

Am avut această problemă. Filezilla a fost bine, .net nu a fost. A fost la un server wordpress. pentru a obține de lucru, am schimbat codul meu de la acest lucru:

ftp://XXX.XXX.XXX.XXX//folder//” + txtFile.Text

în:

ftp://[FTPNAME]@XXX.XXX.XXX.XXX.XXX//”.” + txtFile.Text

și, din fericire, acum funcționează.

Nu știu dacă acest lucru este specific pentru folderele FTP din WordPress.

Eduardo Pelais

În cazul meu, lipsea un folder rădăcină la care se făcea referire în adresa mea ftp. După ce pentru a crea dosarul problema a fost rezolvată.

ftp://xxx.xxx.xx.xx:21//rootfolder/

mjk6035

Și eu aveam aceeași problemă. După ce am monitorizat traficul cu WireShark am înțeles problema

Am configurat un nou site FTP pe serverul meu local IIS FTP numit „testftp „Site-ul „testftp” indica un folder numit d:ftp pe hard disk-ul computerului meuAm primit eroarea „550” de fiecare dată când am încercat să execut linia în bold în codul C# de mai jos ftpHostURL=”ftp://127. 0.0.0.1/testftp/test.htm”; request = (FtpWebRequest)WebRequest.Create(ftpHostURL); request.Proxy = new WebProxy(); //—–Proxy bypassing(Comanda FTP solicitată nu este suportată atunci când se utilizează un proxy HTTP)

            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
           // uploadFilePath = "d://test//tt.txt";
            using (var requestStream = request.GetRequestStream())
            {
                using (var input = File.OpenRead(uploadFilePath))
                {
                    input.CopyTo(requestStream);
                }
            }

Am încercat o mulțime de soluții menționate în diverse site-uri web, dar nimic nu m-a ajutat. Apoi am dat peste un site care sugera să folosesc WireShark pentru a monitoriza traficul.

La monitorizarea traficului cu ajutorul utilitarului RawCap am văzut că aplicația încerca să execute codul de mai jos

STOR testftp/test.htm

Atunci am înțeles problema. IIS se aștepta la un folder numit ‘testftp‘ să fie acolo, sub dosarul rădăcină ftp, care nu era acolo.Aveam în vedere că ‘testftp‘ ca fiind numele folderului virtual creat în IIS, în timp ce IIS îl înțelegea ca fiind un folder sub rădăcina FTP.

Crearea unui folder numit ‘testftp‘ sub folderul rădăcină FTP mi-a rezolvat problema.

Sper că acest lucru este util pentru cineva

SalutăriMathew

dellyjm

Doar pentru a-mi arunca pălăria în ring, am primit aceeași eroare. Când FTPRequest cerea fișiere de la serviciul FTP de pe același computer (același IP). În cerere foloseam adresa IP a mașinii, dar după ce am schimbat-o în 127.0.0.0.1 a funcționat. interesant este că cererile de la alte adrese IP erau procesate și fișierele descărcate, dar nu de la el însuși.

Sper că a ajutat pe cineva.

Shrikant Dandile

Când am avut aceeași problemă am încercat tot ce am încercat mai sus și după o zi mai târziu mi-am dat seama că calea pe care am creat-o pentru uri având un spațiu alb între „/” și numele folderului

string uri="192.168.1.101/ Sync/Image.jpg";

șirul de mai sus ar trebui să fie

string uri="192.168.1.101/Sync/Image.jpg";

această mică greșeală aruncă, de asemenea, aceeași eroare și este o eroare validă, deoarece aceasta nu este o cale validă pentru fișierul nostru dacă conține spații albe între „/” și numele folderului/fișierului

shankar

Am avut aceeași problemă, când am comparat cu ftpuri și numele de utilizator, calea este rezolvată Când am creat accesul ftp, am ales calea ca / nume de director.

în ftpuri, când am inclus numele directorului, a dat eroare, iar când am eliminat numele directorului este rezolvat.

ftpuri cu eroare

ftp://www.example.com/Project/yourfilename.ds

ftpuri rezolvat

ftp://www.example.com/yourfilename.ds

acces ftp la folderul „/Proiect”

user2709214

Și eu am avut recent această problemă. Ceea ce am descoperit este că atunci când folosesc ftpUploadFile, rutina încearcă să pună fișierul în folderul rădăcină ftp. FTP-ul normal prin linia de comandă a funcționat bine. Cu toate acestea, emiterea unei comenzi pwd din linia de comandă ftp a dezvăluit că acest server particular stabilea un director curent diferit la conectare. Modificarea ftpUploadFile pentru a include acest dosar a rezolvat problema.