powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / [QT] как организовать докачку файлов?
23 сообщений из 48, страница 2 из 2
[QT] как организовать докачку файлов?
    #38836955
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сперва делаю вот так читаю до поливины.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 QFile *file=new QFile("C:/qt/"+str);
        if(file->open(QFile::ReadWrite)){
            qint64 fs=file->size();
            qint64 rs=reply->size();
            qint64 i=fs;
            int n=8;
            char data[8];
            reply->seek(fs);
            file->seek(fs);
            while (i<=rs/2){
                if(rs-i<8)n=rs-i;
                reply->read(data,n);
                file->write(data,n);
                file->flush();
                i=i+8;
            }
            file->close();
        }



затем делаю вот так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 QFile *file=new QFile("C:/qt/"+str);
            if(file->open(QFile::Append)){
            qint64 fs=file->size();
            qint64 rs=reply->size();
            qint64 i=fs;
            int n=8;
            char data[8];
            reply->seek(fs);
            file->seek(fs);
            while (i<=rs){
                if(rs-i<8)n=rs-i;
                reply->read(data,n);
                file->write(data,n);
                file->flush();
                i=i+8;
            }
            file->close();
        }


но два раза выходит записывается первая половина файла
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38837071
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежникна http сервере есть команда которая указыывает ему с какого байта выдавать инфу? Content-Range .
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38837089
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovКартежникна http сервере есть команда которая указыывает ему с какого байта выдавать инфу? Content-Range .
спасибл а где это тут указывается
Код: plaintext
1.
2.
3.
4.
  manager=new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
                this, SLOT(replyFinished(QNetworkReply*)));
    manager->get(QNetworkRequest(QUrl(ui->lineEdit->text())));
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38837097
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежникспасибл а где это тут указываетсяДокументацию на QT - это вы уже самостоятельно.
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38837201
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovКартежникспасибл а где это тут указываетсяДокументацию на QT - это вы уже самостоятельно.
manager->head(...) ?
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38837294
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежник,

Видимо через setRawHeader
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38837388
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovКартежникна http сервере есть команда которая указыывает ему с какого байта выдавать инфу? Content-Range .
Поправка, "команда которая указывает серверу с какого байта выдавать инфу" это хедер Range в запросе клиента.
А Content-Range - это хедер, которым сервер в своем ответе сообщает клиенту что он выполнил это указание и что в результате получилось.
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38837566
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, есть такая путаница в моей ссылке.
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838065
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyBasil A. Sidorovпропущено...
Content-Range .
Поправка, "команда которая указывает серверу с какого байта выдавать инфу" это хедер Range в запросе клиента.
А Content-Range - это хедер, которым сервер в своем ответе сообщает клиенту что он выполнил это указание и что в результате получилось.

делаю вот так но все равно получаю целую страницу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
                this, SLOT(replyFinished(QNetworkReply*)));
    QNetworkRequest req;
    req.setRawHeader("Content-Range","bytes 10-29/30");
    req.setUrl(QUrl("http://localhost/"));
    manager->get(req);
    qDebug()<<"finished!";
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838077
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежник,

видимо не хватает HTTP/1.1 206 Partial content, а как его указать? ведь setRawHeader требует название и значение.а здесь только значение
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838120
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не тот заголовок в пример взял)).это со стороны сервера такой заголовок
а с клиента надо так отправлять
Код: plaintext
1.
req.setRawHeader("Range","bytes=10-29");
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838129
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь скажите мне. как сделать чтобы получилось что не весь сразу файл а по немножку получать. допустим по 100 кбит в сек. мне надо каждый раз новый заголовок с соответсвующими значениями формировать и отправлять?
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838252
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я заходил в свойства сетевушки. Ставил в настройках скорость 10 Mbit/s
и получал фактическую скорость трансфера чуть меньше чем 10 * 1024 (kbit/s) / 8 = 1280 Kbit/s.

И тестил какие-то сетевые штуки на предмет падений производительности.
Смотрел как JPEG с progressive рисуется в браузере. И еще всякие штуки.
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838384
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня скорость 8mbit/sec. Допустим я скачиваю какой нить фильм (700мб) или visual studio. допустим в любую секунду может оборваться связь. допустим у меня тарификация а каждый мегабайт.и я не хочу платить лишнего(допустим качать download manager мне тоже не хочется по той же причине). и вот я хочу скачать этот фильм или визуал студию.
ну допустим файл весит 700 мб = 734003200 байт.как лучше поступить?
так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    manager=new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
                this, SLOT(replyFinished(QNetworkReply*)));
    QNetworkRequest req;
    req.setRawHeader("Range","bytes=0-734003199");
    req.setUrl(QUrl(ui->lineEdit->text()));
    manager->get(req);



или в цикле по одному мегабайту?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    manager=new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
                this, SLOT(replyFinished(QNetworkReply*)));
    QNetworkRequest req;
    req.setRawHeader("Range","bytes=0-1048575");
    req.setUrl(QUrl(ui->lineEdit->text()));
    manager->get(req);


и каждый раз увеличивать значение "bytes=" (просто пока не написал увеличение,ну думаю смысл понятен)
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838392
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    manager=new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
                this, SLOT(replyFinished(QNetworkReply*)));
    QNetworkRequest req;
    req.setRawHeader("Range","bytes=0-734003199");
    req.setUrl(QUrl(ui->lineEdit->text()));
    manager->get(req);




я хочу понять этот случай,я думаю следующее, что пока я не загрузится все 734003200 байт доступ к ним я не получу и соответсвенно не смогу сохранить хотя бы какую нить часть? чтоб после разрыва увеличить значение "bytes=x-734003199" где x размер уже загруженных данных. если так то второй вариант мне подходит,ну если конечно кто нить не предложит получше
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838446
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежникя думаю следующее, что пока я не загрузится все 734003200 байт доступ к
ним я не получу и соответсвенно не смогу сохранить хотя бы какую нить часть?
Добавь ещё три нолика и спроси себя: а в какое место будут приниматься все эти гигабайты
пока ты не получишь к ним доступ?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838449
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКартежникя думаю следующее, что пока я не загрузится все 734003200 байт доступ к
ним я не получу и соответсвенно не смогу сохранить хотя бы какую нить часть?
Добавь ещё три нолика и спроси себя: а в какое место будут приниматься все эти гигабайты
пока ты не получишь к ним доступ?..

доступ я к ним получаю следующим образом
Код: plaintext
1.
2.
3.
4.
5.
6.
if(file->open(QFile::ReadWrite))
        {
            file->write(reply->readAll());
            file->flush();
            file->close();
        }



тут я понимаю так что он считывает данные только после того как получил все 734003200(000 хоть с тремя ноликами) байт
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838452
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если файл будет весить 734003200000 то вот тут file->write(reply->readAll()); мне кажется может произойти что то не очень хорошее
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838641
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашел готовое решение.и увидел что там файл запрашивается не по частям, а полностью и если загрузка была приостановлена,то запрос формируется только для оставшейся части файла.
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838767
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имеется класс class myrequest: public QObject вот с этим
тут я хотел отобразить то что вернул скрипт на сервере,т.е. html код страницы
Код: plaintext
1.
2.
3.
4.
public slots:
    void replayFinished(QNetworkReply *rr){
        qDebug()<<"replay= "<<rr->readAll();
    };


и следующей функцией отправляющей post запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int myrequest::sendpost(QString url,QString data){
    QNetworkRequest req;
    manager=new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replayFinished(QNetworkReply*)));
    req.setHeader( QNetworkRequest::ContentTypeHeader, "text/html" );
    req.setUrl(QUrl(url));
    manager->post(req, data.toUtf8());
    return 0;
}


затем по нажатии кнопки формируется следующие данные и отправляется post запрос
Это работает, но не отображает ответ. в принципе скрипт reg.php не отображает ничего
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
void MainWindow::on_pushButton_clicked()
{
    myrequest mr;
    QString url="",data="";
    url="http://localhost/reg.php";
    data.append("lastname="+ui->lineEdit->text());
    data.append("&firstname="+ui->lineEdit_2->text());
    data.append("&fathername="+ui->lineEdit_3->text());
    data.append("&login="+ui->lineEdit_4->text());
    data.append("&pass="+ui->lineEdit_5->text());
    mr.sendpost(url,data);
    
}



Это неизвестно работает или нет. и не отображает ответ.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void MainWindow::on_pushButton_2_clicked()
{   int ver=1;
    myrequest mr;
    QString url="",data="",s="user_version=1";;
    url="http://localhost/new_version.php";
    data.append(s);
    mr.sendpost(url,data);
}
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838768
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Картежник]
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
int myrequest::sendpost(QString url,QString data){
    QNetworkRequest req;
    manager=new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replayFinished(QNetworkReply*)));
    req.setHeader( QNetworkRequest::ContentTypeHeader, "text/html" );
    req.setUrl(QUrl(url));
    manager->post(req, data.toUtf8());
    return 0;
}
[/quot]
тут я переделал вот так
[SRC c++]

int myrequest::sendpost(QString url,QString data){
    QNetworkRequest req;
    manager=new QNetworkAccessManager;
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replayFinished(QNetworkReply*)));
    req.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/x-www-form-urlencoded"));
    req.setUrl(QUrl(url));
    manager->post(req, data.toUtf8());

    return 0;
}
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838769
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин торопился и испортил вопрос. вот правильный вопрос

имеется класс class myrequest: public QObject вот с этим
тут я хотел отобразить то что вернул скрипт на сервере,т.е. html код страницы
Код: plaintext
1.
2.
3.
4.
public slots:
    void replayFinished(QNetworkReply *rr){
        qDebug()<<"replay= "<<rr->readAll();
    };


и следующей функцией отправляющей post запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int myrequest::sendpost(QString url,QString data){
    QNetworkRequest req;
    manager=new QNetworkAccessManager;
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replayFinished(QNetworkReply*)));
    req.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/x-www-form-urlencoded"));
    req.setUrl(QUrl(url));
    manager->post(req, data.toUtf8());

    return 0;
}


затем по нажатии кнопки формируется следующие данные и отправляется post запрос
Это работает, но не отображает ответ. в принципе скрипт reg.php не отображает ничего
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
void MainWindow::on_pushButton_clicked()
{
    myrequest mr;
    QString url="",data="";
    url="http://localhost/reg.php";
    data.append("lastname="+ui->lineEdit->text());
    data.append("&firstname="+ui->lineEdit_2->text());
    data.append("&fathername="+ui->lineEdit_3->text());
    data.append("&login="+ui->lineEdit_4->text());
    data.append("&pass="+ui->lineEdit_5->text());
    mr.sendpost(url,data);
    
}



Это неизвестно работает или нет. и не отображает ответ. Но на самом деле скрипт отображает текст. вот мне нужно получить в QT этот текст. в браузере все работает. а через QT не могу отобразить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void MainWindow::on_pushButton_2_clicked()
{   int ver=1;
    myrequest mr;
    QString url="",data="",s="user_version=1";;
    url="http://localhost/new_version.php";
    data.append(s);
    mr.sendpost(url,data);
}
...
Рейтинг: 0 / 0
[QT] как организовать докачку файлов?
    #38838788
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
когда я делал все то же самое но без использования класса myrequest , все писал в mainwindow.cpp, то я мог получать данные с сервера. а как перенес все в класс то почему то не получается
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / [QT] как организовать докачку файлов?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]