31

I have created a small windows forms application to upload the file to one of our client's ftp site. But the problem that I'm having is that when I run this application on my local machine it uploads the file successfully. But if I run this program on our server, I get this error message;

remote server returned an error: (550) File unavailable (eg, file not found, can not access the file), on this line 'objFTPRequest.GetRequestStream();'.

Does anybody know why? Do I need to configure the firewall or something? Here is my code;

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();
Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
chosenOne Thabs
  • 1,480
  • 3
  • 21
  • 39

15 Answers15

42

This error can be caused because of several reasons like file is not present on server, security permissions on file etc. etc.

First you need to find out the exact cause of error. This can be achieved by using following code-

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

Once you get the exact cause of error, you can go forward to solve it.

Here are some links you can refer

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

Microsoft DN
  • 9,706
  • 10
  • 51
  • 71
  • Hi again. Thanks. The actual error message is 550 Access denied. I have given my folder full permission except 'Special permission'. Is there another possible cause besides 'special permission' ? – chosenOne Thabs Jul 08 '13 at 18:13
  • 2
    Hi guys. I didn't win. I decided to host this app on another machine. It works fine. Thanks. – chosenOne Thabs Sep 11 '13 at 13:09
  • This error may occur if you dont have enough permission or the directory in request is not present. like files in ftp://xxx.xxx.xxx.xxx/files/ – Mahdi Rostami Jun 08 '15 at 16:37
  • 1
    What a helpful tip, I was catching the "Exception" event only, now I can clearly see what the error stands for! Thanks – Bruno Willian Jul 25 '17 at 20:31
29

Try this: ftp://xxx.xxx.xx.xx:21//path/filename

The "//" after the server address starts you out at the root directory. Even though I had: ftp://xxx.xxx.xx.xx:21/path/filename, it didn't take me to the correct directory.

Bremaria
  • 291
  • 3
  • 2
  • 2
    This is so horrible but it actually worked for me - I'm appalled, and I suppose that should be a bug, but thanks. – ocramot May 13 '15 at 14:32
  • 3
    Amazing! That actually solved the problem. Thank god you wrote that. Would have never guessed it in a million years. – Robert4Real Nov 02 '16 at 00:28
  • Also ran into the problem. Great tip, never would have tried that. – Matthias Loerke Apr 06 '17 at 12:09
  • This is got to be a bug in the MS FTP executable. I saw consistent, random failures of longer file paths pushing to an IIS FTP endpoint. The above fixed them. – Matt Mar 23 '18 at 21:42
  • Yup, it was as simple as that...these types of errors are just eating up too much of my time, but thx for the great tip! – Amund Midtskog May 28 '21 at 10:10
8

I met the same problem, and this is what I did:

  1. Check the OS has the right to write. Find the ftp folder =>right click=>properties=>security, then you must know what you should do
  2. Check the ftp server open the write right to the user you logged. Open IIS=>click the ftp site=>ftp Authorization Rules=>add allow rules=>choose a user or group to set the rights
  3. Check the the dir on the ftp server, do the same thing on item 2.

I can use four pictures to show the rights to be set: enter image description here

enter image description here enter image description here enter image description here

Irshad
  • 3,071
  • 5
  • 30
  • 51
francis
  • 161
  • 8
  • Hi francis. I will try your suggestion. I will let you know as soon as i come right. Thank you – chosenOne Thabs Jul 17 '13 at 07:43
  • 1
    Remember to set the permissions on child folders. You can set the permissions on the top most folder and inherit these permissions down to child folders by: go to top level ftp folder =>right click=>properties=>security => advanced => pick a user => change permissions => edit permissions (as required) AND "include inheritable permissions from the object's parent" – robor Oct 08 '14 at 07:54
4

It could be more simple.

I facing similar issue and i tried all the suggested solution but no one work. I'm figure out in simple manner like this one : take a look

Wrong code at my end

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

Change it in this simple one :

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

then procced with fill request and send to server :)

That's all.

Make sure that all permission on server work fine and u're using right credential.

makemoney2010
  • 1,222
  • 10
  • 11
  • Well spotted! I had this problem myself and had a look at the links provided here but they didn't help. Anyhow, the reason for the comment is because the official Microsoft documentation is incorrect. I followed this example: http://msdn.microsoft.com/en-us/library/ms229715(v=vs.110).aspx The request address is suffixed with a ".htm" extension and a text file is uploaded. I just thought the page was an error rather than the extension type. Beware anyone else that follows the above Microsoft example! Regards, Matt – Matthew Blott Jul 11 '14 at 13:37
2

The server usually returns a relevant error message with the 550 code. But the FTP implementation in .NET framework translates all FTP status codes to its own (localized) message. Particularly code 550 is translated to "File unavailable". That, in many cases, hides away the real problem.

Enable .NET logging to see the real error message from the server:
Output log using FtpWebRequest


Here are some various common scenarios that lead to 550 error:

Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
1

I found the solution. The problem is the Current Working Directory of the ftp user. If you type a url like ftp:///path/test.txt it is used as a relative path ro the working directory. For example CWD is /test then the used path is /test/path/test.txt. If you want to use an absolute path, you have to type the url like ftp:////path/test.txt. Then the file is uploaded in the folder /path/test.txt, without exception.

sham
  • 691
  • 8
  • 28
0

In order to resolve this issue, it is required to force the System.Net.FtpWebRequest command to revert back to the old behavior of how it used to work in .Net Framework 2.0/3.5 and issue the extra CWD command before issuing the actual command.

In order to do this, the following code needs to be placed before any instance of the System.Net.FtpWebRequest class is invoked. The code below only needs to be called once, since it changes the settings of the entire application domain.

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

Taras Kravets
  • 1,443
  • 4
  • 14
  • 15
0

Make sure target folder "outbox" exists. That was my problem with error 550.

Simply create target directory "output" before upload.

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
            }
        }
Jan Macháček
  • 612
  • 7
  • 11
0

I had this problem. Filezilla was fine, .net wasn't. It was to a wordpress server. To get it working, I changed the my code from this:

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

to:

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

and it now thankfully works.

I don't know if this is specific to Wordpress FTP folders.

0

In my case, there was a root folder referenced in my ftp address that was missing. After to create the folder the problem was solved.

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

Eduardo Pelais
  • 1,627
  • 15
  • 21
0

I was also having the same issue. After monitoring the traffic with WireShark I understood the problem

I had set up a new FTP site on my local IIS FTP server named 'testftp' The 'testftp' site was pointing to a folder named d:\ftp on my computer's hard disk I was getting the '550' error whenever i tried to execute the line in bold in C# code below ftpHostURL="ftp://127.0.0.1/testftp/test.htm"; request = (FtpWebRequest)WebRequest.Create(ftpHostURL); request.Proxy = new WebProxy(); //-----Proxy bypassing(The requested FTP command is not supported when using HTTP proxy)

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

I tried a lot of solutions mentioned in various websites but nothing helped. Then I came across a site that suggested to use WireShark to monitor the traffic.

On monitoring the traffic using the RawCap Utility I saw that the application was trying to execute the code below

STOR testftp/test.htm

Then I understood the problem. IIS was expecting a folder named 'testftp' to be there under the ftp root folder which was not there. I was considering 'testftp' as the name of the virtual folder created in IIS where as IIS understood it as a folder under the FTP root

Creating a folder named 'testftp' under the FTP root folder solved my issue.

Hope this is helpful to someone

Regards Mathew

mjk6035
  • 121
  • 1
  • 10
-1

Just to throw my hat in the ring, I was getting the same error. When the FTPRequest was requesting files from the FTP Service on the same computer (same IP). In the request I was using the IP address of the machine but once I changed that to 127.0.0.1 it worked. interestingly enough, requests from other IP addresses were being processed and files downloaded, just not from itself.

Hope that helped someone.

dellyjm
  • 426
  • 1
  • 5
  • 10
-1

When i had the same issue i tried everything above and after a day later i realize that the path which i created for uri having a white space in between "/" and the folder name

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

the above string should be

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

this small mistake also throws the same error and it's a valid error because this is not valid path for our file if it contains any white spaces between "/" and folder/file name

Shrikant Dandile
  • 376
  • 3
  • 12
-1

I was having the same problem, when i compared with the ftpuri and User Name Path it is resolved When I create ftp access i have chose the path as /directory name

in the ftpuri when i included the directory name it gave the error and when i removed the directory name it is resolved.

ftpuri with error

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

ftpuri resolved

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

ftp access folder "/Project"

Alexei - check Codidact
  • 22,016
  • 16
  • 145
  • 164
-1

I too had this problem recently. What I found is that when I use ftpUploadFile the routine is trying to put the file in the root ftp folder. Normal command line ftp worked fine. However issuing a pwd command from the command line ftp revealed that this particular server was setting a different current directory upon login. Altering my ftpUploadFile to include this folder resolved the issue.

user2709214
  • 185
  • 2
  • 12