Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 11.04.2016
Сообщений: 10

Как подружить UploadFile и кириллицу?

12.04.2016, 15:49. Показов 3496. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пожалуйста подскажите. Выгружаю на ФТП текстовый файл - содержимое файла русским текстом выгружается корректно, а наименование файла какой-то псевдографикой. При этом две простые программки на С++ и на Python выгружают этот файл туда же с вполне нормальным наименованием. Кроме того двухпанельные манагеры Тотал и Doublecmd копируют туда тоже правильно.
3 недели поиска по яндекс и гугль к результату не привели.
Использование Encoding в разных вариантах и с разными кодировками к результату не привели
byte[] bstr = Encoding.UTF8.GetBytes("абвгдыё.txt");
string sstrf = Encoding.UTF8.GetString(bstr);

Вот один из вариантов кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://127.0.0.1:21/files/абвгдыё.txt");
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = new NetworkCredential ("aad","12345");
            request.KeepAlive=true;
            request.UsePassive=true;
            request.UseBinary=true;
           
           
            FileStream fs = new FileStream("абвгдыё.txt", FileMode.Open);
            byte[] fileContents = new byte[fs.Length];
            fs.Read(fileContents, 0, fileContents.Length);
            fs.Close();
            request.ContentLength = fileContents.Length;
            try{
                Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);
            requestStream.Close();
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
 
             response.Close();
             richTextBox1.AppendText("Upload File Complete, status - "+ response.StatusDescription +"\n");
             File.Delete("абвгдыё.txt");
            }catch(WebException e1){
                richTextBox1.AppendText(e1.Message+"\n");
            }
На локальный сервер из под Win10 все выгружается как надо.
В варианте с WebClient
C#
1
2
3
4
5
WebClient myWebClient = new WebClient ();
 myWebClient.Encoding = Encoding.UTF8;
 myWebClient.Credentials = new NetworkCredential("aad","12345");
 
 string Filename = "абвгдыё.txt";
и т.д.

То же самое - наименование иероглифами.

Добавлено через 18 часов 40 минут
Опять всем привет.
В дополнение к вчерашнему код на питоне, который точно работает:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import ftplib
 
 
host = "XX.XXX.XXX.XXX"
ftp_user = "name"
ftp_password = "password"
 
 
filename = "абвгдыё.txt"
 
try:
    con = ftplib.FTP(host, ftp_user, ftp_password)
    con.set_pasv(True)
    con.port=21
    con.cwd('files/')
 
except PermissionError:
    print("PermissionError")
 
except ConnectionError:
    print("ConnectionError")
    
except Exception:
    print("Exception")
 
else:
    print("Регистрация на ФТП успешна")
 
# Открываем файл для передачи в бинарном режиме
try:
    f = open(filename, "rb")
    fn2 = f.name.encode('cp1251')
    fn3 = fn2.decode('cp1252')
    # Передаем файл на сервер
    send = con.storbinary("STOR "+ fn3, f)
    # Закрываем FTP соединение
    con.close
    
    
except FileNotFoundError:
    print("FileNotFoundError");
 
except UnicodeError:
    print("UnicodeError")
 
except Exception:
    print("Exception")
 
else:
    print("Все в порядке.")
    
 
finally:
    f.close()
Где сразу бросаются в глаза строки:
Python
1
2
 fn2 = f.name.encode('cp1251')
 fn3 = fn2.decode('cp1252')
Однако:
C#
1
2
byte[] fnb = Encoding.GetEncoding(1251).GetBytes(fileName);
string newfileName = Encoding.GetEncoding(1252).GetString(fnb);
по аналогии к положительному результату не привело.

Люди добрые помогите кто чем может. Где я туплю? Как подправить код?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.04.2016, 15:49
Ответы с готовыми решениями:

Ошибка 403 при UploadFile
пишу webClient.UploadFile, выдаёт (403) Запрещено

Как преобразовать кириллицу в формат пригодный для get-запроса
Подскажите, ребят, как преобразовать кириллицу в формат пригодный для get-запроса средством C#. привет =...

как подружить opera и GridView
Здравствуйте! Я выложил сайт на хостинг, для вывода данных из базы использую GridView. В chromium браузере все отображается как надо, но в...

14
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.04.2016, 17:34
Цитата Сообщение от Dakenovich Посмотреть сообщение
Где я туплю?
Вы — нигде, просто все похоже на то, что вы подсоединяетесь к какому-то допотопному серверу, который не поддерживает юникод.
Ну а класс WebRequest кодирует адрес в UTF-8, который потом интерпретируется сервером в локальной кодировке, что и приводит к кракозябрам.
Можете подсоединиться к этому серверу каким-нибудь клиентом или просто через telnet и проверить, поддерживает ли он UTF8, отправив команду FEAT.

Цитата Сообщение от Dakenovich Посмотреть сообщение
Как подправить код?
Попробуйте "закинуть удочку":
C#
1
(FtpWebRequest)WebRequest.Create(Uri.EscapeUriString("ftp://127.0.0.1:21/files/абвгдыё.txt"));
Но сомневаюсь что поможет, если сервер не поддерживает юникод.
Если не поможет, то единственный вариант — отказаться от использования дотнетовского клиента в пользу того, который поддерживает установку другой кодировки адреса. Или позволяет посылать произвольные команды.

Цитата Сообщение от Dakenovich Посмотреть сообщение
Использование Encoding в разных вариантах и с разными кодировками к результату не привели
То, что вы делаете этими двумя строками — это сначала конвертирование строки в кодировке UTF-16 в байты, представляющие строку в кодировке CP1251, а потом конвертирование этих байтов обратно в строку в кодировке UTF-16. Потому что строки в .NET всегда представлены двухбайтовым юникодом.
1
0 / 0 / 0
Регистрация: 11.04.2016
Сообщений: 10
12.04.2016, 18:02  [ТС]
Огромное спасибо за развернутый ответ.
команду FEAT попробую.
C#
1
(FtpWebRequest)WebRequest.Create(Uri.EscapeUriString("ftp://127.0.0.1:21/files/абвгдыё.txt"));
тоже попробую. Тот сервер чужой в другом городе и в сети предприятия, из дома доступа нет. О результате отпишусь.
Про "отказаться от использования дотнетовского клиента" не совсем понял в пользу чего отказаться. Другой ЯП пожалуй уже поздно пытаться освоить, да и кроме winforms на всякие GTK, QT ума не хватает.
Еще раз спасибо.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.04.2016, 18:09
Цитата Сообщение от Dakenovich Посмотреть сообщение
Про "отказаться от использования дотнетовского клиента" не совсем понял в пользу чего отказаться.
Дотнетовский FtpWebRequest — он неказистый, построен на архитектуре stateless HTTP-запросов, потому многие вещи просто не умеет делать.
Есть масса опенсорсных ФТП-клиентов под .NET, например System.Net.FtpClient, в которых многие проблемы встроенного клиента отсутствуют.
Можете в поиске нугета набрать FTP — там полно различных реализаций клиентов.

Цитата Сообщение от Dakenovich Посмотреть сообщение
Другой ЯП пожалуй уже поздно пытаться освоить
Не настолько всё плохо
Просто вместо дотнетовского класса будете использовать другой, из сторонней библиотеки.
0
0 / 0 / 0
Регистрация: 11.04.2016
Сообщений: 10
13.04.2016, 15:40  [ТС]
Добрый вечер.
C#
1
(FtpWebRequest)WebRequest.Create(Uri.EscapeUriString("ftp://127.0.0.1:21/files/абвгдыё.txt"));
К сожалению не сработало

Команда FEAT выдала следующее:
230 Login successful
FEAT
211-Features:
EPRT
EPSV
MDTM
PASV
REST STREAM
SIZE
TVFS
UTF8
211 End
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.04.2016, 16:04
Цитата Сообщение от Dakenovich Посмотреть сообщение
Команда FEAT выдала следующее: UTF8
Сервер говорит, что поддерживает юникод.
Вот блин, не сообразил сразу вчера написать: что он вернет, если подать команду OPTS UTF8?
0
0 / 0 / 0
Регистрация: 11.04.2016
Сообщений: 10
13.04.2016, 16:14  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
подать команду OPTS UTF8
нет проблем. команду зашлю. О результате отпишусь.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.04.2016, 16:28
Цитата Сообщение от Dakenovich Посмотреть сообщение
команду зашлю.
OPTS UTF8 ON конечно же.
0
0 / 0 / 0
Регистрация: 11.04.2016
Сообщений: 10
13.04.2016, 16:44  [ТС]
OPTS UTF8 ON - принято.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.04.2016, 18:25
Цитата Сообщение от Dakenovich Посмотреть сообщение
OPTS UTF8 ON - принято.
Похоже на то, что сервер говорит что якобы умеет работать с юникодом, но на деле считывает команды в локальной кодировке (видать, сервер писал маркетолог).
Разумеется, дотнетовский клиент это видит и отсылает команду STOR в UTF-8, а сервер ее считывает в СР1252.

Для проверки теории попробуйте воспользоваться другим клиентом, например упомянутым выше System.Net.FtpClient.
Чтобы его добавить в проект, в студии откройте консоль NuGet Package Manager Console и пропишите Install-Package System.Net.FtpClient

Как установится, измените ваш код на такой:
C#
1
2
3
4
5
6
7
8
9
10
using (var ftp = new FtpClient())
{
    ftp.Host = "127.0.0.1";
    ftp.Credentials = new NetworkCredential("aad", "12345");
    ftp.Encoding = Encoding.GetEncoding(1252); // Кодировка для команд, которую будет понимать сервер
 
    using (var local = File.OpenRead("абвгдыё.txt"))
    using (var remote = ftp.OpenWrite("files/абвгдыё.txt", FtpDataType.Binary))
        local.CopyTo(remote);
}
Если все равно будут кракозябры, то попробуйте прогнать имя файла через ту странную конвертацию из двух строк, где текст кодируется в 1251, а потом декодируется так, будто байты от 1252.
0
0 / 0 / 0
Регистрация: 11.04.2016
Сообщений: 10
13.04.2016, 19:29  [ТС]
Создал чистый проект, выполнил вышеуказанные команды, на форму поместил кнопку и на Click кнопки код который выше, ошибок при компиляции нет. Программа выполняется до последней строки без видимых ошибок, но файл не копируется. (Проверяю на локальном фтп сервере 127.0.0.1). А как установить пассивный режим? Может в этом дело. На тот рабочий сервер проходит только пассивный режим (выяснено опытным путем программой на питоне (строка con.set_pasv(True) и естественно на локальном я тоже выставил ограничение только пассивный режим.
На работе SharpDevelop и хотел проверить сразу прежде чем нести и скомпилировать готовую тестовую программку. Я так ранее уже делал что бы исключить косяки SharpDevelopa.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.04.2016, 19:56
Цитата Сообщение от Dakenovich Посмотреть сообщение
А как установить пассивный режим?
Перед открытием файлов пропишите ftp.DataConnectionType = FtpDataConnectionType.PASV;
0
0 / 0 / 0
Регистрация: 11.04.2016
Сообщений: 10
13.04.2016, 20:39  [ТС]
Понятно. Спасибо.
Заготовил болванку, то есть все значения вводятся в TextBox-ах. С локальным сервером проверил - работает.
завтра запускаю exe- шник, ввожу значения и запускаю.
0
0 / 0 / 0
Регистрация: 11.04.2016
Сообщений: 10
13.04.2016, 20:48  [ТС]
https://www.cyberforum.ru/atta... 1460569674
Изображения
 
0
0 / 0 / 0
Регистрация: 11.04.2016
Сообщений: 10
14.04.2016, 05:03  [ТС]
OPTS UTF8 ON
200 Always in UTF8 mode.

Программка запускается, но выдает ошибку файл не найден. Может я и схожу с ума, но файл точно в каталоге с программой. Фреймворк последняя версия. Пробовал наименование по английски -не помогает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2016, 05:03
Помогаю со студенческими работами здесь

UltraEdit и русский язык. Как подружить?
Господа! Прочитал тут мессаги о том, какой классный редактор Ultraedit, типа все программеры пользуются. Поставил его вместо своего...

Все таки подружить кириллицу с буфером обмена
Всем привет! Распространенная проблема, но что-то не могу найти решение. Есть DataGridView в ней данные, 15 рядов, 8 столбцов, плюс...

Как прочитать кириллицу из файла?
И как сделать красивую таблицу, чтобы шрифт не такой огромный был? using System; using System.Collections.Generic; using...

Ошибка при загрузки файла webClient.UploadFile
Доброго времени суток, форумчане. Недавно начал изучать класс webclient и решил попробовать протестировать его. Столкнулся с ошибкой в 8...

Шифрования DES, как подлючить кириллицу?
Всем привет! Друзья вот код программы : using System; using System.Collections.Generic; using System.ComponentModel; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru