Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ QFtp, как закачать файл?

Автор: Sam 16.1.2008, 16:51

Делаю так:

    QString szFile = "d:\\test.pdf";
    QFtp ftp;
    QFile file( szFile);
    if( !file.open( QIODevice::ReadOnly))
    {
        QMessageBox::information( 0,
                                  QObject::tr("FTP"),
                                  QObject::tr("Can'not open file: %1 for read.").arg( szFile));
        return -1;
    }

    ftp.connectToHost( "server.ru", 21);
    ftp.login( "user", "password");
    ftp.put( &file, szFile);
    
    ftp.close();
    file.close();

    return 0;
Но файл почему-то не появляется на ftp. :(
И еще не могу найти как сменить директорию, в которую нужно сохранить файл.

Автор: archimed7592 16.1.2008, 17:04

Нужно дожидаться сигнала http://www.crossplatform.ru/documentation/qtdoc4.3/qftp.php#done.

Автор: Sam 16.1.2008, 17:13

Не понял как в моем случае его дождаться?

Автор: archimed7592 16.1.2008, 17:21

Как в твоём - не знаю. Примитивный пример(правда с HTTP):

CODE

// main.hpp
#ifndef main_hpp_included
#define main_hpp_included

#include <ostream>
#include <iostream>

#include <QObject>
#include <QHttp>

class Test
: public QObject
{
Q_OBJECT
public:
Test(QObject *parent = 0)
: QObject(parent)
{
connect(&http, SIGNAL(sslErrors ( const QList<QSslError> & )), &http, SLOT(ignoreSslErrors ()));
connect(&http, SIGNAL(done ( bool )), this, SLOT(done ( bool ))); /// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
QHttp http;
private slots:
void done(bool error)
{
std::cout << "done(" << error << ")" << std::endl;
emit allDone();
}
signals:
void allDone();
};
#endif

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// main.cpp
#include <ostream>
#include <iostream>

#include <QtCore>
#include <QtNetwork>

#include <main.hpp>

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Test test;
QObject::connect(&test, SIGNAL(allDone()), &app, SLOT(quit()));
std::cout << "hi from main" << std::endl;
test.http.setHost("gmail.com", QHttp::ConnectionModeHttps);
test.http.get("/");

return app.exec();
}


Автор: Sam 16.1.2008, 17:26

Спасибо, попробую разобраться... :)

Автор: Alexandr 26.1.2008, 21:12

Все просто. класс QFtp работает асинхронно. те он еще только с сервером начинает соединяться, а у тебя уже файл закрыт. тебе надо дождаться записи, как сказано выше и только потом закрыть файл. я на эту тему скоро заметку напишу на qt-rus.wikidot.com

Автор: Alexandr 27.1.2008, 15:40

Цитата(Alexandr @ 26.1.2008, 21:12) *
напишу на qt-rus.wikidot.com

Разместил.

Автор: PunX 5.6.2009, 13:31

День добрый, есть такой вопрос, я получаю имя и путь файла через:

QString fileName = QFileDialog::getOpenFileName(this);

Как теперь загрузить этот файл на фтп?

Автор: SABROG 5.6.2009, 13:39

Открыть этот файл через QFile и передать в метод int QFtp::put ( QIODevice * dev, const QString & file, TransferType type = Binary )

Автор: PunX 5.6.2009, 14:01

Сделал таким вот образом, но фал не появляется на фтп

void FtpWindow::uploadFile() {
        QString fileName = QFileDialog::getOpenFileName(this);
        QString file = fileName;
        QFile upfile (file);
        ftp->put( &upfile, file);
        upfile.close();

П.С. извините за глупые вопросы :pardon:

Автор: SABROG 5.6.2009, 14:33

Насколько я помню fileName будет содержать не имя файла, а полный путь к файлу вместе с именем. Получается ты пытаешься создать на фтп файл вида "c:\windows\system32\xcopy.exe"

Автор: PunX 5.6.2009, 14:38

Да, fileName содержит полный путь до файла, но как тогда выделить имя файла и сделать правильную загрузку?

Автор: SABROG 5.6.2009, 14:50

QFileInfo fi(fileName);
ftp->put( &upfile, fi.fileName());


Правда у меня есть некоторые сомнения насчет таких вещей как. Нужно ли указывать путь на сервере типа "/filename.ext", типа root директория. И возвращает ли put() управление в программу моментально или ждет пока весь файл загрузится. Если первое (т.е. как и QHttp), то QFile должен создаваться не на стеке, а в куче (через new).

Автор: Litkevich Yuriy 5.6.2009, 15:39

До кучи:

Цитата(PunX @ 5.6.2009, 18:01) *
QString file = fileName;
эта строка лишняя.

Автор: PunX 5.6.2009, 16:17

Делаю
QString fileName = QFileDialog::getOpenFileName(this);
QFileInfo fi(fileName);
QFile upfile (fi.fileName());
ftp->put( &upfile, fi.fileName());
но опять же загрузка не идёт :(

Автор: kwisp 5.6.2009, 16:43

Цитата(SABROG @ 5.6.2009, 15:50) *
И возвращает ли put() управление в программу моментально или ждет пока весь файл загрузится. Если первое (т.е. как и QHttp), то QFile должен создаваться не на стеке, а в куче (через new).

так и есть.
управление возвращается а по окончании действия сигнал
void QFtp::commandFinished ( int id, bool error ) [signal]

Автор: SABROG 5.6.2009, 16:44

Цитата(PunX @ 5.6.2009, 17:17) *
QFile upfile (fi.fileName());


Я же тебе не говорил использовать QFileInfo для QFile. Ты обрезал путь к файлу и пытаешься загрузить файл из текущей рабочей директории, а его там наверняка нет. Сделай так:

QFile *upfile = new QFile(fileName);
ftp->put(upfile, fi.fileName());


А, еще его открыть наверно надо через QFile::open()

Автор: Litkevich Yuriy 5.6.2009, 17:06

Цитата(SABROG @ 5.6.2009, 18:50) *
Если первое (т.е. как и QHttp), то QFile должен создаваться не на стеке, а в куче (через new).
ты совершенно прав:
Цитата
Make sure that the dev pointer is valid for the duration of the operation (it is safe to delete it when the commandFinished() is emitted).


и тут
Цитата(SABROG @ 5.6.2009, 20:44) *
А, еще его открыть наверно надо через QFile::open()
тоже

Автор: PunX 5.6.2009, 17:43

Можете привести пример с аплоадом файла?

Автор: PunX 5.6.2009, 19:52

Всё собрал в одно и получилось вот такое вот:

 void FtpWindow::uploadFile() {
       QString fileName = QFileDialog::getOpenFileName(this);
       QFileInfo  fi(fileName);
       QFile *upfile = new QFile(fileName);
       upfile->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
       ftp->put(upfile, fi.fileName());
       connect(upfile, SIGNAL(done(bool)), this, SLOT(close()));
       upfile->close();
       progressDialog->setLabelText(tr("uploading %1...").arg(fi.fileName()));
       uploadButton->setEnabled(false);
       progressDialog->exec();}

Но всёравно файл не копируется на фтп...

Автор: Litkevich Yuriy 5.6.2009, 20:13

Цитата(PunX @ 5.6.2009, 23:52) *
Но всёравно файл не копируется на фтп...
А у тебя он иным способом копируется, файловым менеджером например?

Автор: SABROG 5.6.2009, 21:21

Цитата
upfile->close();


Убери это, файл будет заливаться на фтп в момент работы приложения.

Автор: kwisp 5.6.2009, 22:13

Цитата(PunX @ 5.6.2009, 20:52) *
Но всёравно файл не копируется на фтп...

а зачем ты его закрыл файл то?
закрывай когда закачаешь.

Автор: Ov3r1oad 21.12.2011, 18:13

Собственно, время идёт, а проблемы остаются те же.

file = new QFile(ToQString("/home/vdi/123.log"));
if ((file->exists()) && file->open(QIODevice::ReadOnly))
{
label_status->setText(file->fileName());
}
ftp->put(file, file->fileName());

Простейший код, однако записать файл на фтп-сервер не получается. ftp->ErrorString выдаёт следующее: "Uploading file failed. File write error". Сервер - GuildFTPd, стоит на винде. А клиент пишу на убунте. Ошибка в клиенте, или сервак неправильно настроен?

Да, и что конкретно делает ftp->list()?

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)