Cyrilli c в имени файла при загрузке на ftp C # - PullRequest
0 голосов
/ 14 июля 2020

Я пишу программу, которая загружает файл на удаленный ftp-сервер. Однако скачанные файлы иногда содержат Cyrilli c. Содержимое файла загружается правильно, но имя искажено. Я так понимаю, это из-за кодировки. Пробовал использовать Encoding.GetEncoding(1251).GetString(Encoding.GetEncoding(1251).GetBytes(file.FileName)) и другие кодировки. Не помогает. В то же время скрипт php, хранящийся на том же ftp, корректно загружает файлы с буквами кирилли c.

public void FtpUpload(IFormFile file, string filePath)
{
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://xxx.xxx.xx.xxx/" + filePath);
        request.Method = WebRequestMethods.Ftp.UploadFile;

        request.Credentials = new NetworkCredential("username", "pass");
        byte[] fileBytes;
        if (file.Length > 0)
        {
            using (var ms = new MemoryStream())
            {
                file.CopyTo(ms);
                fileBytes = ms.ToArray();
            }
        }
        else return;

        request.ContentLength = fileBytes.Length;
        using (Stream request_stream = request.GetRequestStream())
        {
            request_stream.Write(fileBytes, 0, fileBytes.Length);
            request_stream.Close();
        }
}

filePath = "Тест.pdf"

Я пробовал использовать HttpUtility.UrlEncode(filePath). Ничего не помогает. Подскажите, пожалуйста, как с этим бороться?

1 Ответ

0 голосов
/ 15 июля 2020

Решение найдено. Пролистав еще несколько форумов, я наткнулся на следующее решение:

Через NuGet Package Management установите пакет System.Net.FtpClient. Затем мы пишем такой код:

public void FtpClientUpload(IFormFile file, string filePath)
    {
        FtpClient ftp = new FtpClient();
        ftp.Host = "xxx.xxx.xx.xxx";
        ftp.Credentials = new NetworkCredential("username", "pass");
        ftp.Encoding = Encoding.GetEncoding(1251);

        using (var remote = ftp.OpenWrite( filePath, FtpDataType.Binary))
            file.CopyTo(remote);
    }
...