Версия для печати темы
Форум на 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();
П.С. извините за глупые вопросы
Автор: 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)