Ankit
Ankit

Reputation: 2518

Uploading files to ftp folder having special characters in name

I am trying to upload a file on FTP folder, but getting the following error.

The remote server returned an error: (550) File unavailable (e.g., file not found, no access)

I am using the following sample to test this:

    // Get the object used to communicate with the server.
    string path = HttpUtility.UrlEncode("ftp://host:port//01-03-2017/John, Doe S. M.D/file.wav");
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(path);
    request.Method = WebRequestMethods.Ftp.UploadFile;

    // This example assumes the FTP site uses anonymous logon.
    request.Credentials = new NetworkCredential("user", "password");

    // Copy the contents of the file to the request stream.
    StreamReader sourceStream = new StreamReader(@"localpath\example.wav");
    byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
    sourceStream.Close();
    request.ContentLength = fileContents.Length;

    Stream requestStream = request.GetRequestStream();
    requestStream.Write(fileContents, 0, fileContents.Length);
    requestStream.Close();

    FtpWebResponse response = (FtpWebResponse)request.GetResponse();

    Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);

    response.Close();

Thanks for your time and help.

Upvotes: 1

Views: 2203

Answers (3)

Ankit
Ankit

Reputation: 2518

The code works on a C# console application but did not work in Web Api Action. I could not manage to find the reason.

So I have used a free library for the same.

Posting the sample code from one of the examples available here:

So i have used FluentFtp libary available through Nuget.

using System;
using System.IO;
using System.Net;
using FluentFTP;

namespace Examples {
    public class OpenWriteExample {
        public static void OpenWrite() {
            using (FtpClient conn = new FtpClient()) {
                conn.Host = "localhost";
                conn.Credentials = new NetworkCredential("ftptest", "ftptest");

                using (Stream ostream = conn.OpenWrite("01-03-2017/John, Doe S. M.D/file.wav")) {
                    try {
                        // istream.Position is incremented accordingly to the writes you perform
                    }
                    finally {
                        ostream.Close();
                    }
                }
            }
        }
    }
}

Again, if the file is a binary file, StreamReader should not be used as explained here.

Upvotes: 2

Praburaj
Praburaj

Reputation: 613

Use something like this:

string path = HttpUtility.UrlEncode("ftp://96.31.95.118:2121//01-03-2017//ROLLINS, SETH S. M.D//30542_3117.wav");

or You can form a Uri using the following code and pass it webrequest.

var path = new Uri("ftp://96.31.95.118:2121//01-03-2017//ROLLINS, SETH S. M.D//30542_3117.wav");

Upvotes: 2

Martin Prikryl
Martin Prikryl

Reputation: 202272

You need to encode the spaces (and maybe commas) in the URL path, like:

string path =
    "ftp://host:port/01-03-2017/" +
    HttpUtility.UrlEncode("John, Doe S. M.D") + "/file.wav";

Effectively, you get:

ftp://host:port/01-03-2017/John%2c+Doe+S.+M.D/file.wav

Upvotes: 2

Related Questions