Search code examples
c#httpftpfilestream

Download ftp files over http using C#?


I have a ftp server, where I have all the files stored. And it works fine with any ftp client. Now I have to download these file over HTTPS, I tried following approach but it is downloading the file in background and once download completes it asks for which location to save. It works fine if we have a small file, but when we have a large file, the browser keeps on loading till it download the file.

public ActionResult Download(string filePath)
{
    string fileName = "file.csv.gz";
    byte[] fileBytes = GetFile(@"\\myserver-ftp\f$\content\file.csv.gz");

    return File(
    fileBytes, "application/gzip", fileName);
}

 byte[] GetFile(string s)
{
    System.IO.FileStream fs = System.IO.File.OpenRead(s);
    byte[] data = new byte[fs.Length];
    int br = fs.Read(data, 0, data.Length);
    if (br != fs.Length)
        throw new System.IO.IOException(s);
    return data;
}

Solution

  • Download FluentFtp nuget package into your project.

    Create a method like this:

    public async Task<FtpStatus> DownloadFtpFile(string ftpPathOfFile)
    {
        using (var client = new FtpClient(FtpHost))
        {
            client.Connect();
            return client.DownloadFile(localPathToDownload, ftpPathOfFile);
        }
    }
    

    Then you can call it asynchronously:

    public ActionResult Download(string filePath)
        {
            string fileName = "file.csv.gz";
            var fileFullPath = @"\\myserver-ftp\f$\content\file.csv.gz";
    
            var ftpStatus = await DownloadFtpFile(fileFullPath);
        
            if(ftpStatus== FtpStatus.Success)
            {
               return File(GetFile(fileFullPath), "application/gzip", fileName);
            }
            else 
            {
               // return error message;
            }
        }