Russian Qt Forum
Ноябрь 24, 2024, 10:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: передача по ftp. Не хочет русские имена файлов.  (Прочитано 8008 раз)
Yurko_San
Гость
« : Апрель 03, 2017, 12:19 »

Добрый день! Есть не хитрый код для отправки на ftp-сервер, но не хочет отправлять файлы, где есть русские символы. Не подскажите как победить такую проблему. Сам застрял. Код:

Код:
void ServerApiFacade::ftpPut(const QString &localFileName, const QString &serverFileName)
{
    m_ftpFile = new QFile(localFileName);
    if (m_ftpFile->open(QIODevice::ReadWrite)) {
        QUrl url;
        url.setScheme("ftp");
        url.setHost(m_ftpServer);
        url.setPath(serverFileName); // Если в имени русские символы, то выдаётся ошибка
        url.setPassword(m_ftpPassword);
        url.setUserName(m_ftpLogin);
        url.setPort(m_ftpPort);

        QNetworkAccessManager *manager = new QNetworkAccessManager();
        connect(manager, &QNetworkAccessManager::finished, this, &ServerApiFacade::finishFtp);
        QNetworkRequest networkRequest;
        networkRequest.setUrl(url);
        manager->put(networkRequest, m_ftpFile);
        return;
    }
    QString ftpErrorString = tr("File '%1' doesn't open.");
    ftpErrorString = ftpErrorString.arg(localFileName);
    emit ftpTransmissionError(ftpErrorString);
}

При передаче возникает ошибка :

Ошибка в процессе отгрузки : Uploading file failed:
Cannot STOR. . Error state: 201
« Последнее редактирование: Апрель 03, 2017, 12:21 от Yurko_San » Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Апрель 03, 2017, 12:46 »

может ftp сервер не понимает русские символы ?
чего пишет reply->errorString() в ServerApiFacade::finishFtp ?
Записан
Yurko_San
Гость
« Ответ #2 : Апрель 03, 2017, 12:54 »

Пишет:

Ошибка в процессе отгрузки : Uploading file failed:
Cannot STOR. . Error state: 201

При отправке файлов с латиницей всё нормально, так же при отправке русских файлов из Тотал Командера на тот же сервер тоже всё нормально.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #3 : Апрель 03, 2017, 13:06 »

я бы тогда глянул трафик через wireshark
версия qt какая ?
Записан
Yurko_San
Гость
« Ответ #4 : Апрель 03, 2017, 13:07 »

Версия Qt 5.5.0
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #5 : Апрель 03, 2017, 13:17 »

Версия Qt 5.5.0

можно и обновиться, у меня на 560 все ок
Записан
Yurko_San
Гость
« Ответ #6 : Апрель 03, 2017, 13:20 »

Да? Это хорошо. Надо бы обновиться. А можно как-то непосредственно из Qt Creatora обновиться? На что нажать?
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #7 : Апрель 03, 2017, 13:28 »

А можно как-то непосредственно из Qt Creatora обновиться? На что нажать?

Help -> Report Bug )
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #8 : Апрель 03, 2017, 13:33 »

Само значение serverFileName правильно сформировано?

Код
C++ (Qt)
serverFileName = QString::fromUtf8( "Русский текст в кодировке utf-8" ); // так, если исходный файл в кодировке utf-8
serverFileName = QString( "Русский текст в кодировке utf-8" ); // а не так
 

Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #9 : Апрель 03, 2017, 13:44 »

Само значение serverFileName правильно сформировано?

у меня работало и по "неправильному"
тут наверно важно в чем исходники, у меня utf8, потому все ок
а у ТС наверно  cp1251 ?
Записан
Yurko_San
Гость
« Ответ #10 : Апрель 03, 2017, 13:48 »

Попробовал и так - не помогло пока.
Записан
Yurko_San
Гость
« Ответ #11 : Апрель 03, 2017, 14:02 »

Да, исходники в Utf-8, но я так же брал имя и из строки

Код:
    QApplication::setOverrideCursor(Qt::WaitCursor);
    QString localFileName = QFileDialog::getOpenFileName(0, QObject::tr("Export data to Excel"),
                                                    QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation),
                                                    QObject::tr("Excel-Files (*.xlsx)"));


    QString serverFileName = localFileName;
    QFileInfo fileInfo(serverFileName);
    serverFileName = fileInfo.fileName();

Та же ошибка, если есть русские буквы в имени:

Ошибка в процессе отгрузки : Uploading file failed:
Cannot STOR. . Error state: 201
Записан
Yurko_San
Гость
« Ответ #12 : Апрель 04, 2017, 07:13 »

Установил Qt 5.8.0 русские файлы стали отправляться, но на сервере они отображаются всё-равно криво: было Кемерово.xlsx, стало - Кемерово.xlsx
Записан
Yurko_San
Гость
« Ответ #13 : Апрель 04, 2017, 07:35 »

Исходный файл в UTF-8, имя файла: serverFileName = "Кемерю 12 44.xlsx";
При отправке почему-то кодирует в Windows-1251 и на сервере уже отображается как Кемерю 12 44.xlsx

Как избежать кодирования в Windows-1251 перед отправкой? По всей видимости что-то в этом коде нужно поправить:

Код:
    serverFileName = "Кемерю 12 44.xlsx";

    QMessageBox msgBox;
    msgBox.setText(serverFileName);
    msgBox.exec();


    m_file = new QFile(localFileName);
    if (m_file->open(QIODevice::ReadWrite)) {
        QUrl url;
        url.setScheme("ftp");
        url.setHost("rrr.rrtg-rk.ru");
        url.setPath(serverFileName, QUrl::ParsingMode::TolerantMode);
        url.setPassword("ge34");
        url.setUserName("pro213");
        url.setPort(21);

        QNetworkRequest networkRequest;
        networkRequest.setUrl(url);
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #14 : Апрель 04, 2017, 08:26 »

При отправке почему-то кодирует в Windows-1251 и на сервере уже отображается как Кемерю 12 44.xlsx

отображается чем ?
насколько я помню ftp серверу наплевать на кодировку, её определяет смотрящий

Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.114 секунд. Запросов: 23.